From 4be691b8c39c1d6f66b5e58210eeb25d6c6390d5 Mon Sep 17 00:00:00 2001 From: kylin-mayukun Date: Fri, 29 Apr 2022 18:48:11 +0800 Subject: [PATCH] add kernel-rt.spec and rt patches --- 0000-kernel-5.10.0-83.0.0-rt62.patch | 26078 ++++++++++++++++ ...-modify-openeuler_defconfig-for-rt62.patch | 145 + _multibuild | 3 +- kernel-rt.spec | 15655 ++++++++++ 4 files changed, 41880 insertions(+), 1 deletion(-) create mode 100644 0000-kernel-5.10.0-83.0.0-rt62.patch create mode 100644 0001-modify-openeuler_defconfig-for-rt62.patch create mode 100644 kernel-rt.spec diff --git a/0000-kernel-5.10.0-83.0.0-rt62.patch b/0000-kernel-5.10.0-83.0.0-rt62.patch new file mode 100644 index 00000000..2762b017 --- /dev/null +++ b/0000-kernel-5.10.0-83.0.0-rt62.patch @@ -0,0 +1,26078 @@ +diff --git a/Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.rst b/Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.rst +index 72f0f6fbd..6f89cf1e5 100644 +--- a/Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.rst ++++ b/Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.rst +@@ -38,7 +38,7 @@ sections. + RCU-preempt Expedited Grace Periods + =================================== + +-``CONFIG_PREEMPT=y`` kernels implement RCU-preempt. ++``CONFIG_PREEMPTION=y`` kernels implement RCU-preempt. + The overall flow of the handling of a given CPU by an RCU-preempt + expedited grace period is shown in the following diagram: + +@@ -112,7 +112,7 @@ things. + RCU-sched Expedited Grace Periods + --------------------------------- + +-``CONFIG_PREEMPT=n`` kernels implement RCU-sched. The overall flow of ++``CONFIG_PREEMPTION=n`` kernels implement RCU-sched. The overall flow of + the handling of a given CPU by an RCU-sched expedited grace period is + shown in the following diagram: + +diff --git a/Documentation/RCU/Design/Requirements/Requirements.rst b/Documentation/RCU/Design/Requirements/Requirements.rst +index 1ae79a10a..17d38480e 100644 +--- a/Documentation/RCU/Design/Requirements/Requirements.rst ++++ b/Documentation/RCU/Design/Requirements/Requirements.rst +@@ -78,7 +78,7 @@ RCU treats a nested set as one big RCU read-side critical section. + Production-quality implementations of ``rcu_read_lock()`` and + ``rcu_read_unlock()`` are extremely lightweight, and in fact have + exactly zero overhead in Linux kernels built for production use with +-``CONFIG_PREEMPT=n``. ++``CONFIG_PREEMPTION=n``. + + This guarantee allows ordering to be enforced with extremely low + overhead to readers, for example: +@@ -1182,7 +1182,7 @@ and has become decreasingly so as memory sizes have expanded and memory + costs have plummeted. However, as I learned from Matt Mackall's + `bloatwatch `__ efforts, memory + footprint is critically important on single-CPU systems with +-non-preemptible (``CONFIG_PREEMPT=n``) kernels, and thus `tiny ++non-preemptible (``CONFIG_PREEMPTION=n``) kernels, and thus `tiny + RCU `__ + was born. Josh Triplett has since taken over the small-memory banner + with his `Linux kernel tinification `__ +@@ -1498,7 +1498,7 @@ limitations. + + Implementations of RCU for which ``rcu_read_lock()`` and + ``rcu_read_unlock()`` generate no code, such as Linux-kernel RCU when +-``CONFIG_PREEMPT=n``, can be nested arbitrarily deeply. After all, there ++``CONFIG_PREEMPTION=n``, can be nested arbitrarily deeply. After all, there + is no overhead. Except that if all these instances of + ``rcu_read_lock()`` and ``rcu_read_unlock()`` are visible to the + compiler, compilation will eventually fail due to exhausting memory, +@@ -1771,7 +1771,7 @@ implementation can be a no-op. + + However, once the scheduler has spawned its first kthread, this early + boot trick fails for ``synchronize_rcu()`` (as well as for +-``synchronize_rcu_expedited()``) in ``CONFIG_PREEMPT=y`` kernels. The ++``synchronize_rcu_expedited()``) in ``CONFIG_PREEMPTION=y`` kernels. The + reason is that an RCU read-side critical section might be preempted, + which means that a subsequent ``synchronize_rcu()`` really does have to + wait for something, as opposed to simply returning immediately. +@@ -2010,7 +2010,7 @@ the following: + 5 rcu_read_unlock(); + 6 do_something_with(v, user_v); + +-If the compiler did make this transformation in a ``CONFIG_PREEMPT=n`` kernel ++If the compiler did make this transformation in a ``CONFIG_PREEMPTION=n`` kernel + build, and if ``get_user()`` did page fault, the result would be a quiescent + state in the middle of an RCU read-side critical section. This misplaced + quiescent state could result in line 4 being a use-after-free access, +@@ -2289,10 +2289,10 @@ decides to throw at it. + + The Linux kernel is used for real-time workloads, especially in + conjunction with the `-rt +-patchset `__. The ++patchset `__. The + real-time-latency response requirements are such that the traditional + approach of disabling preemption across RCU read-side critical sections +-is inappropriate. Kernels built with ``CONFIG_PREEMPT=y`` therefore use ++is inappropriate. Kernels built with ``CONFIG_PREEMPTION=y`` therefore use + an RCU implementation that allows RCU read-side critical sections to be + preempted. This requirement made its presence known after users made it + clear that an earlier `real-time +@@ -2414,7 +2414,7 @@ includes ``rcu_read_lock_bh()``, ``rcu_read_unlock_bh()``, + ``call_rcu_bh()``, ``rcu_barrier_bh()``, and + ``rcu_read_lock_bh_held()``. However, the update-side APIs are now + simple wrappers for other RCU flavors, namely RCU-sched in +-CONFIG_PREEMPT=n kernels and RCU-preempt otherwise. ++CONFIG_PREEMPTION=n kernels and RCU-preempt otherwise. + + Sched Flavor (Historical) + ~~~~~~~~~~~~~~~~~~~~~~~~~ +@@ -2432,11 +2432,11 @@ not have this property, given that any point in the code outside of an + RCU read-side critical section can be a quiescent state. Therefore, + *RCU-sched* was created, which follows “classic” RCU in that an + RCU-sched grace period waits for pre-existing interrupt and NMI +-handlers. In kernels built with ``CONFIG_PREEMPT=n``, the RCU and ++handlers. In kernels built with ``CONFIG_PREEMPTION=n``, the RCU and + RCU-sched APIs have identical implementations, while kernels built with +-``CONFIG_PREEMPT=y`` provide a separate implementation for each. ++``CONFIG_PREEMPTION=y`` provide a separate implementation for each. + +-Note well that in ``CONFIG_PREEMPT=y`` kernels, ++Note well that in ``CONFIG_PREEMPTION=y`` kernels, + ``rcu_read_lock_sched()`` and ``rcu_read_unlock_sched()`` disable and + re-enable preemption, respectively. This means that if there was a + preemption attempt during the RCU-sched read-side critical section, +@@ -2599,10 +2599,10 @@ userspace execution also delimit tasks-RCU read-side critical sections. + + The tasks-RCU API is quite compact, consisting only of + ``call_rcu_tasks()``, ``synchronize_rcu_tasks()``, and +-``rcu_barrier_tasks()``. In ``CONFIG_PREEMPT=n`` kernels, trampolines ++``rcu_barrier_tasks()``. In ``CONFIG_PREEMPTION=n`` kernels, trampolines + cannot be preempted, so these APIs map to ``call_rcu()``, + ``synchronize_rcu()``, and ``rcu_barrier()``, respectively. In +-``CONFIG_PREEMPT=y`` kernels, trampolines can be preempted, and these ++``CONFIG_PREEMPTION=y`` kernels, trampolines can be preempted, and these + three APIs are therefore implemented by separate functions that check + for voluntary context switches. + +diff --git a/Documentation/RCU/checklist.rst b/Documentation/RCU/checklist.rst +index 2efed9926..7ed495604 100644 +--- a/Documentation/RCU/checklist.rst ++++ b/Documentation/RCU/checklist.rst +@@ -214,7 +214,7 @@ over a rather long period of time, but improvements are always welcome! + the rest of the system. + + 7. As of v4.20, a given kernel implements only one RCU flavor, +- which is RCU-sched for PREEMPT=n and RCU-preempt for PREEMPT=y. ++ which is RCU-sched for PREEMPTION=n and RCU-preempt for PREEMPTION=y. + If the updater uses call_rcu() or synchronize_rcu(), + then the corresponding readers my use rcu_read_lock() and + rcu_read_unlock(), rcu_read_lock_bh() and rcu_read_unlock_bh(), +diff --git a/Documentation/RCU/rcubarrier.rst b/Documentation/RCU/rcubarrier.rst +index f64f4413a..3b4a24877 100644 +--- a/Documentation/RCU/rcubarrier.rst ++++ b/Documentation/RCU/rcubarrier.rst +@@ -9,7 +9,7 @@ RCU (read-copy update) is a synchronization mechanism that can be thought + of as a replacement for read-writer locking (among other things), but with + very low-overhead readers that are immune to deadlock, priority inversion, + and unbounded latency. RCU read-side critical sections are delimited +-by rcu_read_lock() and rcu_read_unlock(), which, in non-CONFIG_PREEMPT ++by rcu_read_lock() and rcu_read_unlock(), which, in non-CONFIG_PREEMPTION + kernels, generate no code whatsoever. + + This means that RCU writers are unaware of the presence of concurrent +@@ -329,10 +329,10 @@ Answer: This cannot happen. The reason is that on_each_cpu() has its last + to smp_call_function() and further to smp_call_function_on_cpu(), + causing this latter to spin until the cross-CPU invocation of + rcu_barrier_func() has completed. This by itself would prevent +- a grace period from completing on non-CONFIG_PREEMPT kernels, ++ a grace period from completing on non-CONFIG_PREEMPTION kernels, + since each CPU must undergo a context switch (or other quiescent + state) before the grace period can complete. However, this is +- of no use in CONFIG_PREEMPT kernels. ++ of no use in CONFIG_PREEMPTION kernels. + + Therefore, on_each_cpu() disables preemption across its call + to smp_call_function() and also across the local call to +diff --git a/Documentation/RCU/stallwarn.rst b/Documentation/RCU/stallwarn.rst +index c9ab6af4d..e97d1b487 100644 +--- a/Documentation/RCU/stallwarn.rst ++++ b/Documentation/RCU/stallwarn.rst +@@ -25,7 +25,7 @@ warnings: + + - A CPU looping with bottom halves disabled. + +-- For !CONFIG_PREEMPT kernels, a CPU looping anywhere in the kernel ++- For !CONFIG_PREEMPTION kernels, a CPU looping anywhere in the kernel + without invoking schedule(). If the looping in the kernel is + really expected and desirable behavior, you might need to add + some calls to cond_resched(). +@@ -44,7 +44,7 @@ warnings: + result in the ``rcu_.*kthread starved for`` console-log message, + which will include additional debugging information. + +-- A CPU-bound real-time task in a CONFIG_PREEMPT kernel, which might ++- A CPU-bound real-time task in a CONFIG_PREEMPTION kernel, which might + happen to preempt a low-priority task in the middle of an RCU + read-side critical section. This is especially damaging if + that low-priority task is not permitted to run on any other CPU, +diff --git a/Documentation/RCU/whatisRCU.rst b/Documentation/RCU/whatisRCU.rst +index fb3ff76c3..3b2b1479f 100644 +--- a/Documentation/RCU/whatisRCU.rst ++++ b/Documentation/RCU/whatisRCU.rst +@@ -684,7 +684,7 @@ Quick Quiz #1: + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + This section presents a "toy" RCU implementation that is based on + "classic RCU". It is also short on performance (but only for updates) and +-on features such as hotplug CPU and the ability to run in CONFIG_PREEMPT ++on features such as hotplug CPU and the ability to run in CONFIG_PREEMPTION + kernels. The definitions of rcu_dereference() and rcu_assign_pointer() + are the same as those shown in the preceding section, so they are omitted. + :: +@@ -740,7 +740,7 @@ Quick Quiz #2: + Quick Quiz #3: + If it is illegal to block in an RCU read-side + critical section, what the heck do you do in +- PREEMPT_RT, where normal spinlocks can block??? ++ CONFIG_PREEMPT_RT, where normal spinlocks can block??? + + :ref:`Answers to Quick Quiz <8_whatisRCU>` + +@@ -1094,7 +1094,7 @@ Quick Quiz #2: + overhead is **negative**. + + Answer: +- Imagine a single-CPU system with a non-CONFIG_PREEMPT ++ Imagine a single-CPU system with a non-CONFIG_PREEMPTION + kernel where a routing table is used by process-context + code, but can be updated by irq-context code (for example, + by an "ICMP REDIRECT" packet). The usual way of handling +@@ -1121,10 +1121,10 @@ Answer: + Quick Quiz #3: + If it is illegal to block in an RCU read-side + critical section, what the heck do you do in +- PREEMPT_RT, where normal spinlocks can block??? ++ CONFIG_PREEMPT_RT, where normal spinlocks can block??? + + Answer: +- Just as PREEMPT_RT permits preemption of spinlock ++ Just as CONFIG_PREEMPT_RT permits preemption of spinlock + critical sections, it permits preemption of RCU + read-side critical sections. It also permits + spinlocks blocking while in RCU read-side critical +diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt +index ad50e4ebe..ce3e784e4 100644 +--- a/Documentation/admin-guide/kernel-parameters.txt ++++ b/Documentation/admin-guide/kernel-parameters.txt +@@ -4263,6 +4263,10 @@ + value, meaning that RCU_SOFTIRQ is used by default. + Specify rcutree.use_softirq=0 to use rcuc kthreads. + ++ But note that CONFIG_PREEMPT_RT=y kernels disable ++ this kernel boot parameter, forcibly setting it ++ to zero. ++ + rcutree.rcu_fanout_exact= [KNL] + Disable autobalancing of the rcu_node combining + tree. This is used by rcutorture, and might +@@ -4641,6 +4645,13 @@ + only normal grace-period primitives. No effect + on CONFIG_TINY_RCU kernels. + ++ But note that CONFIG_PREEMPT_RT=y kernels enables ++ this kernel boot parameter, forcibly setting ++ it to the value one, that is, converting any ++ post-boot attempt at an expedited RCU grace ++ period to instead use normal non-expedited ++ grace-period processing. ++ + rcupdate.rcu_task_ipi_delay= [KNL] + Set time in jiffies during which RCU tasks will + avoid sending IPIs, starting with the beginning +diff --git a/Documentation/driver-api/io-mapping.rst b/Documentation/driver-api/io-mapping.rst +index a966239f0..a7830c594 100644 +--- a/Documentation/driver-api/io-mapping.rst ++++ b/Documentation/driver-api/io-mapping.rst +@@ -20,78 +20,64 @@ A mapping object is created during driver initialization using:: + mappable, while 'size' indicates how large a mapping region to + enable. Both are in bytes. + +-This _wc variant provides a mapping which may only be used +-with the io_mapping_map_atomic_wc or io_mapping_map_wc. ++This _wc variant provides a mapping which may only be used with ++io_mapping_map_local_wc() or io_mapping_map_wc(). + +-With this mapping object, individual pages can be mapped either atomically +-or not, depending on the necessary scheduling environment. Of course, atomic +-maps are more efficient:: ++With this mapping object, individual pages can be mapped either temporarily ++or long term, depending on the requirements. Of course, temporary maps are ++more efficient. + +- void *io_mapping_map_atomic_wc(struct io_mapping *mapping, +- unsigned long offset) ++ void *io_mapping_map_local_wc(struct io_mapping *mapping, ++ unsigned long offset) + +-'offset' is the offset within the defined mapping region. +-Accessing addresses beyond the region specified in the +-creation function yields undefined results. Using an offset +-which is not page aligned yields an undefined result. The +-return value points to a single page in CPU address space. ++'offset' is the offset within the defined mapping region. Accessing ++addresses beyond the region specified in the creation function yields ++undefined results. Using an offset which is not page aligned yields an ++undefined result. The return value points to a single page in CPU address ++space. + +-This _wc variant returns a write-combining map to the +-page and may only be used with mappings created by +-io_mapping_create_wc ++This _wc variant returns a write-combining map to the page and may only be ++used with mappings created by io_mapping_create_wc() + +-Note that the task may not sleep while holding this page +-mapped. ++Temporary mappings are only valid in the context of the caller. The mapping ++is not guaranteed to be globaly visible. + +-:: ++io_mapping_map_local_wc() has a side effect on X86 32bit as it disables ++migration to make the mapping code work. No caller can rely on this side ++effect. + +- void io_mapping_unmap_atomic(void *vaddr) ++Nested mappings need to be undone in reverse order because the mapping ++code uses a stack for keeping track of them:: + +-'vaddr' must be the value returned by the last +-io_mapping_map_atomic_wc call. This unmaps the specified +-page and allows the task to sleep once again. ++ addr1 = io_mapping_map_local_wc(map1, offset1); ++ addr2 = io_mapping_map_local_wc(map2, offset2); ++ ... ++ io_mapping_unmap_local(addr2); ++ io_mapping_unmap_local(addr1); + +-If you need to sleep while holding the lock, you can use the non-atomic +-variant, although they may be significantly slower. ++The mappings are released with:: + +-:: ++ void io_mapping_unmap_local(void *vaddr) ++ ++'vaddr' must be the value returned by the last io_mapping_map_local_wc() ++call. This unmaps the specified mapping and undoes eventual side effects of ++the mapping function. ++ ++If you need to sleep while holding a mapping, you can use the regular ++variant, although this may be significantly slower:: + + void *io_mapping_map_wc(struct io_mapping *mapping, + unsigned long offset) + +-This works like io_mapping_map_atomic_wc except it allows +-the task to sleep while holding the page mapped. ++This works like io_mapping_map_local_wc() except it has no side effects and ++the pointer is globaly visible. + +- +-:: ++The mappings are released with:: + + void io_mapping_unmap(void *vaddr) + +-This works like io_mapping_unmap_atomic, except it is used +-for pages mapped with io_mapping_map_wc. ++Use for pages mapped with io_mapping_map_wc(). + + At driver close time, the io_mapping object must be freed:: + + void io_mapping_free(struct io_mapping *mapping) +- +-Current Implementation +-====================== +- +-The initial implementation of these functions uses existing mapping +-mechanisms and so provides only an abstraction layer and no new +-functionality. +- +-On 64-bit processors, io_mapping_create_wc calls ioremap_wc for the whole +-range, creating a permanent kernel-visible mapping to the resource. The +-map_atomic and map functions add the requested offset to the base of the +-virtual address returned by ioremap_wc. +- +-On 32-bit processors with HIGHMEM defined, io_mapping_map_atomic_wc uses +-kmap_atomic_pfn to map the specified page in an atomic fashion; +-kmap_atomic_pfn isn't really supposed to be used with device pages, but it +-provides an efficient mapping for this usage. +- +-On 32-bit processors without HIGHMEM defined, io_mapping_map_atomic_wc and +-io_mapping_map_wc both use ioremap_wc, a terribly inefficient function which +-performs an IPI to inform all processors about the new mapping. This results +-in a significant performance penalty. +diff --git a/arch/Kconfig b/arch/Kconfig +index 7a8e3d45b..4dbc4c659 100644 +--- a/arch/Kconfig ++++ b/arch/Kconfig +@@ -50,6 +50,7 @@ config OPROFILE + tristate "OProfile system profiling" + depends on PROFILING + depends on HAVE_OPROFILE ++ depends on !PREEMPT_RT + select RING_BUFFER + select RING_BUFFER_ALLOW_SWAP + help +@@ -673,6 +674,12 @@ config HAVE_TIF_NOHZ + config HAVE_VIRT_CPU_ACCOUNTING + bool + ++config HAVE_VIRT_CPU_ACCOUNTING_IDLE ++ bool ++ help ++ Architecture has its own way to account idle CPU time and therefore ++ doesn't implement vtime_account_idle(). ++ + config ARCH_HAS_SCALED_CPUTIME + bool + +@@ -687,7 +694,6 @@ config HAVE_VIRT_CPU_ACCOUNTING_GEN + some 32-bit arches may require multiple accesses, so proper + locking is needed to protect against concurrent accesses. + +- + config HAVE_IRQ_TIME_ACCOUNTING + bool + help +diff --git a/arch/alpha/include/asm/kmap_types.h b/arch/alpha/include/asm/kmap_types.h +deleted file mode 100644 +index 651714b45..000000000 +--- a/arch/alpha/include/asm/kmap_types.h ++++ /dev/null +@@ -1,15 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0 */ +-#ifndef _ASM_KMAP_TYPES_H +-#define _ASM_KMAP_TYPES_H +- +-/* Dummy header just to define km_type. */ +- +-#ifdef CONFIG_DEBUG_HIGHMEM +-#define __WITH_KM_FENCE +-#endif +- +-#include +- +-#undef __WITH_KM_FENCE +- +-#endif +diff --git a/arch/alpha/include/asm/spinlock_types.h b/arch/alpha/include/asm/spinlock_types.h +index 1d5716bc0..6883bc952 100644 +--- a/arch/alpha/include/asm/spinlock_types.h ++++ b/arch/alpha/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef _ALPHA_SPINLOCK_TYPES_H + #define _ALPHA_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + typedef struct { + volatile unsigned int lock; + } arch_spinlock_t; +diff --git a/arch/arc/Kconfig b/arch/arc/Kconfig +index 0a89cc9de..d8804001d 100644 +--- a/arch/arc/Kconfig ++++ b/arch/arc/Kconfig +@@ -507,6 +507,7 @@ config LINUX_RAM_BASE + config HIGHMEM + bool "High Memory Support" + select ARCH_DISCONTIGMEM_ENABLE ++ select KMAP_LOCAL + help + With ARC 2G:2G address split, only upper 2G is directly addressable by + kernel. Enable this to potentially allow access to rest of 2G and PAE +diff --git a/arch/arc/include/asm/highmem.h b/arch/arc/include/asm/highmem.h +index 6e5eafb3a..a6b8e2c35 100644 +--- a/arch/arc/include/asm/highmem.h ++++ b/arch/arc/include/asm/highmem.h +@@ -9,17 +9,29 @@ + #ifdef CONFIG_HIGHMEM + + #include +-#include ++#include ++ ++#define FIXMAP_SIZE PGDIR_SIZE ++#define PKMAP_SIZE PGDIR_SIZE + + /* start after vmalloc area */ + #define FIXMAP_BASE (PAGE_OFFSET - FIXMAP_SIZE - PKMAP_SIZE) +-#define FIXMAP_SIZE PGDIR_SIZE /* only 1 PGD worth */ +-#define KM_TYPE_NR ((FIXMAP_SIZE >> PAGE_SHIFT)/NR_CPUS) +-#define FIXMAP_ADDR(nr) (FIXMAP_BASE + ((nr) << PAGE_SHIFT)) ++ ++#define FIX_KMAP_SLOTS (KM_MAX_IDX * NR_CPUS) ++#define FIX_KMAP_BEGIN (0UL) ++#define FIX_KMAP_END ((FIX_KMAP_BEGIN + FIX_KMAP_SLOTS) - 1) ++ ++#define FIXADDR_TOP (FIXMAP_BASE + (FIX_KMAP_END << PAGE_SHIFT)) ++ ++/* ++ * This should be converted to the asm-generic version, but of course this ++ * is needlessly different from all other architectures. Sigh - tglx ++ */ ++#define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT)) ++#define __virt_to_fix(x) (((FIXADDR_TOP - ((x) & PAGE_MASK))) >> PAGE_SHIFT) + + /* start after fixmap area */ + #define PKMAP_BASE (FIXMAP_BASE + FIXMAP_SIZE) +-#define PKMAP_SIZE PGDIR_SIZE + #define LAST_PKMAP (PKMAP_SIZE >> PAGE_SHIFT) + #define LAST_PKMAP_MASK (LAST_PKMAP - 1) + #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT)) +@@ -29,11 +41,13 @@ + + extern void kmap_init(void); + ++#define arch_kmap_local_post_unmap(vaddr) \ ++ local_flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE) ++ + static inline void flush_cache_kmaps(void) + { + flush_cache_all(); + } +- + #endif + + #endif +diff --git a/arch/arc/include/asm/kmap_types.h b/arch/arc/include/asm/kmap_types.h +deleted file mode 100644 +index fecf7851e..000000000 +--- a/arch/arc/include/asm/kmap_types.h ++++ /dev/null +@@ -1,14 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0-only */ +-/* +- * Copyright (C) 2015 Synopsys, Inc. (www.synopsys.com) +- */ +- +-#ifndef _ASM_KMAP_TYPES_H +-#define _ASM_KMAP_TYPES_H +- +-/* +- * We primarily need to define KM_TYPE_NR here but that in turn +- * is a function of PGDIR_SIZE etc. +- * To avoid circular deps issue, put everything in asm/highmem.h +- */ +-#endif +diff --git a/arch/arc/mm/highmem.c b/arch/arc/mm/highmem.c +index 1b9f473c6..c79912a6b 100644 +--- a/arch/arc/mm/highmem.c ++++ b/arch/arc/mm/highmem.c +@@ -36,9 +36,8 @@ + * This means each only has 1 PGDIR_SIZE worth of kvaddr mappings, which means + * 2M of kvaddr space for typical config (8K page and 11:8:13 traversal split) + * +- * - fixmap anyhow needs a limited number of mappings. So 2M kvaddr == 256 PTE +- * slots across NR_CPUS would be more than sufficient (generic code defines +- * KM_TYPE_NR as 20). ++ * - The fixed KMAP slots for kmap_local/atomic() require KM_MAX_IDX slots per ++ * CPU. So the number of CPUs sharing a single PTE page is limited. + * + * - pkmap being preemptible, in theory could do with more than 256 concurrent + * mappings. However, generic pkmap code: map_new_virtual(), doesn't traverse +@@ -47,48 +46,6 @@ + */ + + extern pte_t * pkmap_page_table; +-static pte_t * fixmap_page_table; +- +-void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) +-{ +- int idx, cpu_idx; +- unsigned long vaddr; +- +- cpu_idx = kmap_atomic_idx_push(); +- idx = cpu_idx + KM_TYPE_NR * smp_processor_id(); +- vaddr = FIXMAP_ADDR(idx); +- +- set_pte_at(&init_mm, vaddr, fixmap_page_table + idx, +- mk_pte(page, prot)); +- +- return (void *)vaddr; +-} +-EXPORT_SYMBOL(kmap_atomic_high_prot); +- +-void kunmap_atomic_high(void *kv) +-{ +- unsigned long kvaddr = (unsigned long)kv; +- +- if (kvaddr >= FIXMAP_BASE && kvaddr < (FIXMAP_BASE + FIXMAP_SIZE)) { +- +- /* +- * Because preemption is disabled, this vaddr can be associated +- * with the current allocated index. +- * But in case of multiple live kmap_atomic(), it still relies on +- * callers to unmap in right order. +- */ +- int cpu_idx = kmap_atomic_idx(); +- int idx = cpu_idx + KM_TYPE_NR * smp_processor_id(); +- +- WARN_ON(kvaddr != FIXMAP_ADDR(idx)); +- +- pte_clear(&init_mm, kvaddr, fixmap_page_table + idx); +- local_flush_tlb_kernel_range(kvaddr, kvaddr + PAGE_SIZE); +- +- kmap_atomic_idx_pop(); +- } +-} +-EXPORT_SYMBOL(kunmap_atomic_high); + + static noinline pte_t * __init alloc_kmap_pgtable(unsigned long kvaddr) + { +@@ -108,10 +65,9 @@ void __init kmap_init(void) + { + /* Due to recursive include hell, we can't do this in processor.h */ + BUILD_BUG_ON(PAGE_OFFSET < (VMALLOC_END + FIXMAP_SIZE + PKMAP_SIZE)); ++ BUILD_BUG_ON(LAST_PKMAP > PTRS_PER_PTE); ++ BUILD_BUG_ON(FIX_KMAP_SLOTS > PTRS_PER_PTE); + +- BUILD_BUG_ON(KM_TYPE_NR > PTRS_PER_PTE); + pkmap_page_table = alloc_kmap_pgtable(PKMAP_BASE); +- +- BUILD_BUG_ON(LAST_PKMAP > PTRS_PER_PTE); +- fixmap_page_table = alloc_kmap_pgtable(FIXMAP_BASE); ++ alloc_kmap_pgtable(FIXMAP_BASE); + } +diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig +index 29a634b7d..77c96bea6 100644 +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -31,6 +31,7 @@ config ARM + select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX + select ARCH_OPTIONAL_KERNEL_RWX_DEFAULT if CPU_V7 + select ARCH_SUPPORTS_ATOMIC_RMW ++ select ARCH_SUPPORTS_RT if HAVE_POSIX_CPU_TIMERS_TASK_WORK + select ARCH_USE_BUILTIN_BSWAP + select ARCH_USE_CMPXCHG_LOCKREF + select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU +@@ -66,7 +67,7 @@ config ARM + select HARDIRQS_SW_RESEND + select HAVE_ARCH_AUDITSYSCALL if AEABI && !OABI_COMPAT + select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 +- select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU ++ select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU && !PREEMPT_RT + select HAVE_ARCH_KFENCE if MMU + select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU + select HAVE_ARCH_KASAN if MMU && !XIP_KERNEL +@@ -108,6 +109,7 @@ config ARM + select HAVE_PERF_EVENTS + select HAVE_PERF_REGS + select HAVE_PERF_USER_STACK_DUMP ++ select HAVE_PREEMPT_LAZY + select MMU_GATHER_RCU_TABLE_FREE if SMP && ARM_LPAE + select HAVE_REGS_AND_STACK_ACCESS_API + select HAVE_RSEQ +@@ -123,6 +125,7 @@ config ARM + select OLD_SIGSUSPEND3 + select PCI_SYSCALL if PCI + select PERF_USE_VMALLOC ++ select HAVE_POSIX_CPU_TIMERS_TASK_WORK if !KVM + select RTC_LIB + select SET_FS + select SYS_SUPPORTS_APM_EMULATION +@@ -1512,6 +1515,7 @@ config HAVE_ARCH_PFN_VALID + config HIGHMEM + bool "High Memory Support" + depends on MMU ++ select KMAP_LOCAL + help + The address space of ARM processors is only 4 Gigabytes large + and it has to accommodate user address space, kernel address +diff --git a/arch/arm/include/asm/fixmap.h b/arch/arm/include/asm/fixmap.h +index 9575b4040..707068f85 100644 +--- a/arch/arm/include/asm/fixmap.h ++++ b/arch/arm/include/asm/fixmap.h +@@ -7,14 +7,14 @@ + #define FIXADDR_TOP (FIXADDR_END - PAGE_SIZE) + + #include +-#include ++#include + + enum fixed_addresses { + FIX_EARLYCON_MEM_BASE, + __end_of_permanent_fixed_addresses, + + FIX_KMAP_BEGIN = __end_of_permanent_fixed_addresses, +- FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_TYPE_NR * NR_CPUS) - 1, ++ FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_MAX_IDX * NR_CPUS) - 1, + + /* Support writing RO kernel text via kprobes, jump labels, etc. */ + FIX_TEXT_POKE0, +diff --git a/arch/arm/include/asm/hardirq.h b/arch/arm/include/asm/hardirq.h +index b95848ed2..706efafbf 100644 +--- a/arch/arm/include/asm/hardirq.h ++++ b/arch/arm/include/asm/hardirq.h +@@ -2,16 +2,11 @@ + #ifndef __ASM_HARDIRQ_H + #define __ASM_HARDIRQ_H + +-#include +-#include + #include + +-typedef struct { +- unsigned int __softirq_pending; +-} ____cacheline_aligned irq_cpustat_t; +- +-#include /* Standard mappings for irq_cpustat_t above */ +- + #define __ARCH_IRQ_EXIT_IRQS_DISABLED 1 ++#define ack_bad_irq ack_bad_irq ++ ++#include + + #endif /* __ASM_HARDIRQ_H */ +diff --git a/arch/arm/include/asm/highmem.h b/arch/arm/include/asm/highmem.h +index 31811be38..b22dffa8c 100644 +--- a/arch/arm/include/asm/highmem.h ++++ b/arch/arm/include/asm/highmem.h +@@ -2,7 +2,8 @@ + #ifndef _ASM_HIGHMEM_H + #define _ASM_HIGHMEM_H + +-#include ++#include ++#include + + #define PKMAP_BASE (PAGE_OFFSET - PMD_SIZE) + #define LAST_PKMAP PTRS_PER_PTE +@@ -46,19 +47,32 @@ extern pte_t *pkmap_page_table; + + #ifdef ARCH_NEEDS_KMAP_HIGH_GET + extern void *kmap_high_get(struct page *page); +-#else ++ ++static inline void *arch_kmap_local_high_get(struct page *page) ++{ ++ if (IS_ENABLED(CONFIG_DEBUG_HIGHMEM) && !cache_is_vivt()) ++ return NULL; ++ return kmap_high_get(page); ++} ++#define arch_kmap_local_high_get arch_kmap_local_high_get ++ ++#else /* ARCH_NEEDS_KMAP_HIGH_GET */ + static inline void *kmap_high_get(struct page *page) + { + return NULL; + } +-#endif ++#endif /* !ARCH_NEEDS_KMAP_HIGH_GET */ + +-/* +- * The following functions are already defined by +- * when CONFIG_HIGHMEM is not set. +- */ +-#ifdef CONFIG_HIGHMEM +-extern void *kmap_atomic_pfn(unsigned long pfn); +-#endif ++#define arch_kmap_local_post_map(vaddr, pteval) \ ++ local_flush_tlb_kernel_page(vaddr) ++ ++#define arch_kmap_local_pre_unmap(vaddr) \ ++do { \ ++ if (cache_is_vivt()) \ ++ __cpuc_flush_dcache_area((void *)vaddr, PAGE_SIZE); \ ++} while (0) ++ ++#define arch_kmap_local_post_unmap(vaddr) \ ++ local_flush_tlb_kernel_page(vaddr) + + #endif +diff --git a/arch/arm/include/asm/irq.h b/arch/arm/include/asm/irq.h +index 54b0180c8..36d040c68 100644 +--- a/arch/arm/include/asm/irq.h ++++ b/arch/arm/include/asm/irq.h +@@ -31,6 +31,8 @@ void handle_IRQ(unsigned int, struct pt_regs *); + void init_IRQ(void); + + #ifdef CONFIG_SMP ++#include ++ + extern bool arch_trigger_cpumask_backtrace(const cpumask_t *mask, + bool exclude_self); + #define arch_trigger_cpumask_backtrace arch_trigger_cpumask_backtrace +diff --git a/arch/arm/include/asm/kmap_types.h b/arch/arm/include/asm/kmap_types.h +deleted file mode 100644 +index 5590940ee..000000000 +--- a/arch/arm/include/asm/kmap_types.h ++++ /dev/null +@@ -1,10 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0 */ +-#ifndef __ARM_KMAP_TYPES_H +-#define __ARM_KMAP_TYPES_H +- +-/* +- * This is the "bare minimum". AIO seems to require this. +- */ +-#define KM_TYPE_NR 16 +- +-#endif +diff --git a/arch/arm/include/asm/spinlock_types.h b/arch/arm/include/asm/spinlock_types.h +index 597695864..a37c08039 100644 +--- a/arch/arm/include/asm/spinlock_types.h ++++ b/arch/arm/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef __ASM_SPINLOCK_TYPES_H + #define __ASM_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + #define TICKET_SHIFT 16 + + typedef struct { +diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h +index 9f7ca79cc..9f31470f6 100644 +--- a/arch/arm/include/asm/thread_info.h ++++ b/arch/arm/include/asm/thread_info.h +@@ -55,6 +55,7 @@ struct cpu_context_save { + struct thread_info { + unsigned long flags; /* low level flags */ + int preempt_count; /* 0 => preemptable, <0 => bug */ ++ int preempt_lazy_count; /* 0 => preemptable, <0 => bug */ + mm_segment_t addr_limit; /* address limit */ + struct task_struct *task; /* main task structure */ + __u32 cpu; /* cpu */ +@@ -145,8 +146,9 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, + #define TIF_SYSCALL_TRACE 4 /* syscall trace active */ + #define TIF_SYSCALL_AUDIT 5 /* syscall auditing active */ + #define TIF_SYSCALL_TRACEPOINT 6 /* syscall tracepoint instrumentation */ +-#define TIF_SECCOMP 7 /* seccomp syscall filtering active */ +-#define TIF_PATCH_PENDING 8 /* pending live patching update */ ++#define TIF_NEED_RESCHED_LAZY 7 ++#define TIF_SECCOMP 8 /* seccomp syscall filtering active */ ++#define TIF_PATCH_PENDING 9 /* pending live patching update */ + + #define TIF_USING_IWMMXT 17 + #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ +@@ -155,6 +157,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, + #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) + #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) + #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) ++#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) + #define _TIF_UPROBE (1 << TIF_UPROBE) + #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) + #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) +@@ -171,7 +174,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, + * Change these and you break ASM code in entry-common.S + */ + #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ +- _TIF_NOTIFY_RESUME | _TIF_UPROBE) ++ _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ ++ _TIF_NEED_RESCHED_LAZY) + + #endif /* __KERNEL__ */ + #endif /* __ASM_ARM_THREAD_INFO_H */ +diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c +index 70993af22..024c65c3a 100644 +--- a/arch/arm/kernel/asm-offsets.c ++++ b/arch/arm/kernel/asm-offsets.c +@@ -43,6 +43,7 @@ int main(void) + BLANK(); + DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); + DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); ++ DEFINE(TI_PREEMPT_LAZY, offsetof(struct thread_info, preempt_lazy_count)); + DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit)); + DEFINE(TI_TASK, offsetof(struct thread_info, task)); + DEFINE(TI_CPU, offsetof(struct thread_info, cpu)); +diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S +index 4c43295e1..ce2482591 100644 +--- a/arch/arm/kernel/entry-armv.S ++++ b/arch/arm/kernel/entry-armv.S +@@ -207,11 +207,18 @@ __irq_svc: + + #ifdef CONFIG_PREEMPTION + ldr r8, [tsk, #TI_PREEMPT] @ get preempt count +- ldr r0, [tsk, #TI_FLAGS] @ get flags + teq r8, #0 @ if preempt count != 0 ++ bne 1f @ return from exeption ++ ldr r0, [tsk, #TI_FLAGS] @ get flags ++ tst r0, #_TIF_NEED_RESCHED @ if NEED_RESCHED is set ++ blne svc_preempt @ preempt! ++ ++ ldr r8, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count ++ teq r8, #0 @ if preempt lazy count != 0 + movne r0, #0 @ force flags to 0 +- tst r0, #_TIF_NEED_RESCHED ++ tst r0, #_TIF_NEED_RESCHED_LAZY + blne svc_preempt ++1: + #endif + + svc_exit r5, irq = 1 @ return from exception +@@ -226,8 +233,14 @@ svc_preempt: + 1: bl preempt_schedule_irq @ irq en/disable is done inside + ldr r0, [tsk, #TI_FLAGS] @ get new tasks TI_FLAGS + tst r0, #_TIF_NEED_RESCHED ++ bne 1b ++ tst r0, #_TIF_NEED_RESCHED_LAZY + reteq r8 @ go again +- b 1b ++ ldr r0, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count ++ teq r0, #0 @ if preempt lazy count != 0 ++ beq 1b ++ ret r8 @ go again ++ + #endif + + __und_fault: +diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S +index fee279e28..d0d326290 100644 +--- a/arch/arm/kernel/entry-common.S ++++ b/arch/arm/kernel/entry-common.S +@@ -54,7 +54,9 @@ __ret_fast_syscall: + cmp r2, r1 + blne addr_limit_check_failed + ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing +- tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK ++ tst r1, #((_TIF_SYSCALL_WORK | _TIF_WORK_MASK) & ~_TIF_SECCOMP) ++ bne fast_work_pending ++ tst r1, #_TIF_SECCOMP + bne fast_work_pending + + +@@ -92,8 +94,11 @@ __ret_fast_syscall: + cmp r2, r1 + blne addr_limit_check_failed + ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing +- tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK ++ tst r1, #((_TIF_SYSCALL_WORK | _TIF_WORK_MASK) & ~_TIF_SECCOMP) ++ bne do_slower_path ++ tst r1, #_TIF_SECCOMP + beq no_work_pending ++do_slower_path: + UNWIND(.fnend ) + ENDPROC(ret_fast_syscall) + +diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c +index 2f81d3af5..6e69f7b3d 100644 +--- a/arch/arm/kernel/signal.c ++++ b/arch/arm/kernel/signal.c +@@ -649,7 +649,8 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall) + */ + trace_hardirqs_off(); + do { +- if (likely(thread_flags & _TIF_NEED_RESCHED)) { ++ if (likely(thread_flags & (_TIF_NEED_RESCHED | ++ _TIF_NEED_RESCHED_LAZY))) { + schedule(); + } else { + if (unlikely(!user_mode(regs))) +diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c +index d94e39a21..44383bfbf 100644 +--- a/arch/arm/kernel/smp.c ++++ b/arch/arm/kernel/smp.c +@@ -671,9 +671,7 @@ static void do_handle_IPI(int ipinr) + break; + + case IPI_CPU_BACKTRACE: +- printk_nmi_enter(); + nmi_cpu_backtrace(get_irq_regs()); +- printk_nmi_exit(); + break; + + default: +diff --git a/arch/arm/mm/Makefile b/arch/arm/mm/Makefile +index 4536159bc..3510503bc 100644 +--- a/arch/arm/mm/Makefile ++++ b/arch/arm/mm/Makefile +@@ -21,7 +21,6 @@ KASAN_SANITIZE_physaddr.o := n + obj-$(CONFIG_DEBUG_VIRTUAL) += physaddr.o + + obj-$(CONFIG_ALIGNMENT_TRAP) += alignment.o +-obj-$(CONFIG_HIGHMEM) += highmem.o + obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o + obj-$(CONFIG_ARM_PV_FIXUP) += pv-fixup-asm.o + +diff --git a/arch/arm/mm/cache-feroceon-l2.c b/arch/arm/mm/cache-feroceon-l2.c +index 10f909744..fd9e3e740 100644 +--- a/arch/arm/mm/cache-feroceon-l2.c ++++ b/arch/arm/mm/cache-feroceon-l2.c +@@ -49,9 +49,9 @@ static inline unsigned long l2_get_va(unsigned long paddr) + * we simply install a virtual mapping for it only for the + * TLB lookup to occur, hence no need to flush the untouched + * memory mapping afterwards (note: a cache flush may happen +- * in some circumstances depending on the path taken in kunmap_atomic). ++ * in some circumstances depending on the path taken in kunmap_local). + */ +- void *vaddr = kmap_atomic_pfn(paddr >> PAGE_SHIFT); ++ void *vaddr = kmap_local_pfn(paddr >> PAGE_SHIFT); + return (unsigned long)vaddr + (paddr & ~PAGE_MASK); + #else + return __phys_to_virt(paddr); +@@ -61,7 +61,7 @@ static inline unsigned long l2_get_va(unsigned long paddr) + static inline void l2_put_va(unsigned long vaddr) + { + #ifdef CONFIG_HIGHMEM +- kunmap_atomic((void *)vaddr); ++ kunmap_local((void *)vaddr); + #endif + } + +diff --git a/arch/arm/mm/cache-xsc3l2.c b/arch/arm/mm/cache-xsc3l2.c +index 581473165..f34845da3 100644 +--- a/arch/arm/mm/cache-xsc3l2.c ++++ b/arch/arm/mm/cache-xsc3l2.c +@@ -59,7 +59,7 @@ static inline void l2_unmap_va(unsigned long va) + { + #ifdef CONFIG_HIGHMEM + if (va != -1) +- kunmap_atomic((void *)va); ++ kunmap_local((void *)va); + #endif + } + +@@ -75,7 +75,7 @@ static inline unsigned long l2_map_va(unsigned long pa, unsigned long prev_va) + * in place for it. + */ + l2_unmap_va(prev_va); +- va = (unsigned long)kmap_atomic_pfn(pa >> PAGE_SHIFT); ++ va = (unsigned long)kmap_local_pfn(pa >> PAGE_SHIFT); + } + return va + (pa_offset >> (32 - PAGE_SHIFT)); + #else +diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c +index 91965fb04..d34166682 100644 +--- a/arch/arm/mm/fault.c ++++ b/arch/arm/mm/fault.c +@@ -430,6 +430,9 @@ do_translation_fault(unsigned long addr, unsigned int fsr, + if (addr < TASK_SIZE) + return do_page_fault(addr, fsr, regs); + ++ if (interrupts_enabled(regs)) ++ local_irq_enable(); ++ + if (user_mode(regs)) + goto bad_area; + +diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c +deleted file mode 100644 +index 187fab227..000000000 +--- a/arch/arm/mm/highmem.c ++++ /dev/null +@@ -1,121 +0,0 @@ +-// SPDX-License-Identifier: GPL-2.0-only +-/* +- * arch/arm/mm/highmem.c -- ARM highmem support +- * +- * Author: Nicolas Pitre +- * Created: september 8, 2008 +- * Copyright: Marvell Semiconductors Inc. +- */ +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include "mm.h" +- +-static inline void set_fixmap_pte(int idx, pte_t pte) +-{ +- unsigned long vaddr = __fix_to_virt(idx); +- pte_t *ptep = virt_to_kpte(vaddr); +- +- set_pte_ext(ptep, pte, 0); +- local_flush_tlb_kernel_page(vaddr); +-} +- +-static inline pte_t get_fixmap_pte(unsigned long vaddr) +-{ +- pte_t *ptep = virt_to_kpte(vaddr); +- +- return *ptep; +-} +- +-void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) +-{ +- unsigned int idx; +- unsigned long vaddr; +- void *kmap; +- int type; +- +-#ifdef CONFIG_DEBUG_HIGHMEM +- /* +- * There is no cache coherency issue when non VIVT, so force the +- * dedicated kmap usage for better debugging purposes in that case. +- */ +- if (!cache_is_vivt()) +- kmap = NULL; +- else +-#endif +- kmap = kmap_high_get(page); +- if (kmap) +- return kmap; +- +- type = kmap_atomic_idx_push(); +- +- idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); +- vaddr = __fix_to_virt(idx); +-#ifdef CONFIG_DEBUG_HIGHMEM +- /* +- * With debugging enabled, kunmap_atomic forces that entry to 0. +- * Make sure it was indeed properly unmapped. +- */ +- BUG_ON(!pte_none(get_fixmap_pte(vaddr))); +-#endif +- /* +- * When debugging is off, kunmap_atomic leaves the previous mapping +- * in place, so the contained TLB flush ensures the TLB is updated +- * with the new mapping. +- */ +- set_fixmap_pte(idx, mk_pte(page, prot)); +- +- return (void *)vaddr; +-} +-EXPORT_SYMBOL(kmap_atomic_high_prot); +- +-void kunmap_atomic_high(void *kvaddr) +-{ +- unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; +- int idx, type; +- +- if (kvaddr >= (void *)FIXADDR_START) { +- type = kmap_atomic_idx(); +- idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); +- +- if (cache_is_vivt()) +- __cpuc_flush_dcache_area((void *)vaddr, PAGE_SIZE); +-#ifdef CONFIG_DEBUG_HIGHMEM +- BUG_ON(vaddr != __fix_to_virt(idx)); +- set_fixmap_pte(idx, __pte(0)); +-#else +- (void) idx; /* to kill a warning */ +-#endif +- kmap_atomic_idx_pop(); +- } else if (vaddr >= PKMAP_ADDR(0) && vaddr < PKMAP_ADDR(LAST_PKMAP)) { +- /* this address was obtained through kmap_high_get() */ +- kunmap_high(pte_page(pkmap_page_table[PKMAP_NR(vaddr)])); +- } +-} +-EXPORT_SYMBOL(kunmap_atomic_high); +- +-void *kmap_atomic_pfn(unsigned long pfn) +-{ +- unsigned long vaddr; +- int idx, type; +- struct page *page = pfn_to_page(pfn); +- +- preempt_disable(); +- pagefault_disable(); +- if (!PageHighMem(page)) +- return page_address(page); +- +- type = kmap_atomic_idx_push(); +- idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); +- vaddr = __fix_to_virt(idx); +-#ifdef CONFIG_DEBUG_HIGHMEM +- BUG_ON(!pte_none(get_fixmap_pte(vaddr))); +-#endif +- set_fixmap_pte(idx, pfn_pte(pfn, kmap_prot)); +- +- return (void *)vaddr; +-} +diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig +index 259e4a183..60a502c99 100644 +--- a/arch/arm64/Kconfig ++++ b/arch/arm64/Kconfig +@@ -76,6 +76,7 @@ config ARM64 + select ARCH_SUPPORTS_ATOMIC_RMW + select ARCH_SUPPORTS_INT128 if CC_HAS_INT128 && (GCC_VERSION >= 50000 || CC_IS_CLANG) + select ARCH_SUPPORTS_NUMA_BALANCING ++ select ARCH_SUPPORTS_RT if HAVE_POSIX_CPU_TIMERS_TASK_WORK + select ARCH_WANT_COMPAT_IPC_PARSE_VERSION if COMPAT + select ARCH_WANT_DEFAULT_BPF_JIT + select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT +@@ -177,6 +178,7 @@ config ARM64 + select HAVE_PERF_EVENTS + select HAVE_PERF_REGS + select HAVE_PERF_USER_STACK_DUMP ++ select HAVE_PREEMPT_LAZY + select HAVE_REGS_AND_STACK_ACCESS_API + select HAVE_FUNCTION_ARG_ACCESS_API + select HAVE_FUTEX_CMPXCHG if FUTEX +@@ -199,6 +201,7 @@ config ARM64 + select PCI_DOMAINS_GENERIC if PCI + select PCI_ECAM if (ACPI && PCI) + select PCI_SYSCALL if PCI ++ select HAVE_POSIX_CPU_TIMERS_TASK_WORK if !KVM + select POWER_RESET + select POWER_SUPPLY + select SPARSE_IRQ +diff --git a/arch/arm64/include/asm/hardirq.h b/arch/arm64/include/asm/hardirq.h +index 5ffa4bacd..cbfa7b6f2 100644 +--- a/arch/arm64/include/asm/hardirq.h ++++ b/arch/arm64/include/asm/hardirq.h +@@ -13,11 +13,8 @@ + #include + #include + +-typedef struct { +- unsigned int __softirq_pending; +-} ____cacheline_aligned irq_cpustat_t; +- +-#include /* Standard mappings for irq_cpustat_t above */ ++#define ack_bad_irq ack_bad_irq ++#include + + #define __ARCH_IRQ_EXIT_IRQS_DISABLED 1 + +diff --git a/arch/arm64/include/asm/preempt.h b/arch/arm64/include/asm/preempt.h +index e83f0982b..7a5770d82 100644 +--- a/arch/arm64/include/asm/preempt.h ++++ b/arch/arm64/include/asm/preempt.h +@@ -70,17 +70,43 @@ static inline bool __preempt_count_dec_and_test(void) + * interrupt occurring between the non-atomic READ_ONCE/WRITE_ONCE + * pair. + */ +- return !pc || !READ_ONCE(ti->preempt_count); ++ if (!pc || !READ_ONCE(ti->preempt_count)) ++ return true; ++#ifdef CONFIG_PREEMPT_LAZY ++ if ((pc & ~PREEMPT_NEED_RESCHED)) ++ return false; ++ if (current_thread_info()->preempt_lazy_count) ++ return false; ++ return test_thread_flag(TIF_NEED_RESCHED_LAZY); ++#else ++ return false; ++#endif + } + + static inline bool should_resched(int preempt_offset) + { ++#ifdef CONFIG_PREEMPT_LAZY ++ u64 pc = READ_ONCE(current_thread_info()->preempt_count); ++ if (pc == preempt_offset) ++ return true; ++ ++ if ((pc & ~PREEMPT_NEED_RESCHED) != preempt_offset) ++ return false; ++ ++ if (current_thread_info()->preempt_lazy_count) ++ return false; ++ return test_thread_flag(TIF_NEED_RESCHED_LAZY); ++#else + u64 pc = READ_ONCE(current_thread_info()->preempt_count); + return pc == preempt_offset; ++#endif + } + + #ifdef CONFIG_PREEMPTION + void preempt_schedule(void); ++#ifdef CONFIG_PREEMPT_RT ++void preempt_schedule_lock(void); ++#endif + #define __preempt_schedule() preempt_schedule() + void preempt_schedule_notrace(void); + #define __preempt_schedule_notrace() preempt_schedule_notrace() +diff --git a/arch/arm64/include/asm/spinlock_types.h b/arch/arm64/include/asm/spinlock_types.h +index 18782f0c4..6672b0535 100644 +--- a/arch/arm64/include/asm/spinlock_types.h ++++ b/arch/arm64/include/asm/spinlock_types.h +@@ -5,10 +5,6 @@ + #ifndef __ASM_SPINLOCK_TYPES_H + #define __ASM_SPINLOCK_TYPES_H + +-#if !defined(__LINUX_SPINLOCK_TYPES_H) && !defined(__ASM_SPINLOCK_H) +-# error "please don't include this file directly" +-#endif +- + #include + #include + +diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h +index af49b6190..0ad7b958c 100644 +--- a/arch/arm64/include/asm/thread_info.h ++++ b/arch/arm64/include/asm/thread_info.h +@@ -27,6 +27,7 @@ struct thread_info { + #ifdef CONFIG_ARM64_SW_TTBR0_PAN + u64 ttbr0; /* saved TTBR0_EL1 */ + #endif ++ int preempt_lazy_count; /* 0 => preemptable, <0 => bug */ + union { + u64 preempt_count; /* 0 => preemptible, <0 => bug */ + struct { +@@ -69,6 +70,7 @@ void arch_release_task_struct(struct task_struct *tsk); + #define TIF_FOREIGN_FPSTATE 3 /* CPU's FP state is not current's */ + #define TIF_UPROBE 4 /* uprobe breakpoint or singlestep */ + #define TIF_MTE_ASYNC_FAULT 5 /* MTE Asynchronous Tag Check Fault */ ++#define TIF_NEED_RESCHED_LAZY 6 + #define TIF_SYSCALL_TRACE 8 /* syscall trace active */ + #define TIF_SYSCALL_AUDIT 9 /* syscall auditing */ + #define TIF_SYSCALL_TRACEPOINT 10 /* syscall tracepoint for ftrace */ +@@ -101,14 +103,17 @@ void arch_release_task_struct(struct task_struct *tsk); + #define _TIF_32BIT (1 << TIF_32BIT) + #define _TIF_SVE (1 << TIF_SVE) + #define _TIF_MTE_ASYNC_FAULT (1 << TIF_MTE_ASYNC_FAULT) ++#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) + #define _TIF_32BIT_AARCH64 (1 << TIF_32BIT_AARCH64) + #define _TIF_PATCH_PENDING (1 << TIF_PATCH_PENDING) + #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) + + #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ + _TIF_NOTIFY_RESUME | _TIF_FOREIGN_FPSTATE | \ +- _TIF_UPROBE | _TIF_MTE_ASYNC_FAULT) ++ _TIF_UPROBE | _TIF_MTE_ASYNC_FAULT | \ ++ _TIF_NEED_RESCHED_LAZY) + ++#define _TIF_NEED_RESCHED_MASK (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY) + #define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ + _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | \ + _TIF_SYSCALL_EMU) +diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c +index 5f59e24c9..4f522206c 100644 +--- a/arch/arm64/kernel/asm-offsets.c ++++ b/arch/arm64/kernel/asm-offsets.c +@@ -31,6 +31,7 @@ int main(void) + DEFINE(TSK_TI_CPU, offsetof(struct task_struct, thread_info.cpu)); + DEFINE(TSK_TI_FLAGS, offsetof(struct task_struct, thread_info.flags)); + DEFINE(TSK_TI_PREEMPT, offsetof(struct task_struct, thread_info.preempt_count)); ++ DEFINE(TSK_TI_PREEMPT_LAZY, offsetof(struct task_struct, thread_info.preempt_lazy_count)); + #ifdef CONFIG_ARM64_SW_TTBR0_PAN + DEFINE(TSK_TI_TTBR0, offsetof(struct task_struct, thread_info.ttbr0)); + #endif +diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S +index 21bcf1e79..aa6593f0b 100644 +--- a/arch/arm64/kernel/entry.S ++++ b/arch/arm64/kernel/entry.S +@@ -503,9 +503,18 @@ alternative_if ARM64_HAS_IRQ_PRIO_MASKING + mrs x0, daif + orr x24, x24, x0 + alternative_else_nop_endif +- cbnz x24, 1f // preempt count != 0 || NMI return path +- bl arm64_preempt_schedule_irq // irq en/disable is done inside ++ ++ cbz x24, 1f // (need_resched + count) == 0 ++ cbnz w24, 2f // count != 0 ++ ++ ldr w24, [tsk, #TSK_TI_PREEMPT_LAZY] // get preempt lazy count ++ cbnz w24, 2f // preempt lazy count != 0 ++ ++ ldr x0, [tsk, #TSK_TI_FLAGS] // get flags ++ tbz x0, #TIF_NEED_RESCHED_LAZY, 2f // needs rescheduling? + 1: ++ bl arm64_preempt_schedule_irq // irq en/disable is done inside ++2: + #endif + + mov x0, sp +diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c +index 5335a6bd1..84520f116 100644 +--- a/arch/arm64/kernel/fpsimd.c ++++ b/arch/arm64/kernel/fpsimd.c +@@ -226,6 +226,16 @@ static void sve_free(struct task_struct *task) + __sve_free(task); + } + ++static void *sve_free_atomic(struct task_struct *task) ++{ ++ void *sve_state = task->thread.sve_state; ++ ++ WARN_ON(test_tsk_thread_flag(task, TIF_SVE)); ++ ++ task->thread.sve_state = NULL; ++ return sve_state; ++} ++ + /* + * TIF_SVE controls whether a task can use SVE without trapping while + * in userspace, and also the way a task's FPSIMD/SVE state is stored +@@ -1022,6 +1032,7 @@ void fpsimd_thread_switch(struct task_struct *next) + void fpsimd_flush_thread(void) + { + int vl, supported_vl; ++ void *mem = NULL; + + if (!system_supports_fpsimd()) + return; +@@ -1034,7 +1045,7 @@ void fpsimd_flush_thread(void) + + if (system_supports_sve()) { + clear_thread_flag(TIF_SVE); +- sve_free(current); ++ mem = sve_free_atomic(current); + + /* + * Reset the task vector length as required. +@@ -1068,6 +1079,7 @@ void fpsimd_flush_thread(void) + } + + put_cpu_fpsimd_context(); ++ kfree(mem); + } + + /* +diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c +index d288bb4a1..3e5b354dd 100644 +--- a/arch/arm64/kernel/signal.c ++++ b/arch/arm64/kernel/signal.c +@@ -692,7 +692,7 @@ asmlinkage void do_notify_resume(struct pt_regs *regs, + unsigned long thread_flags) + { + do { +- if (thread_flags & _TIF_NEED_RESCHED) { ++ if (thread_flags & _TIF_NEED_RESCHED_MASK) { + /* Unmask Debug and SError for the next task */ + local_daif_restore(DAIF_PROCCTX_NOIRQ); + +diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c +index 3ae13ef0c..1fa19b717 100644 +--- a/arch/arm64/kvm/arm.c ++++ b/arch/arm64/kvm/arm.c +@@ -779,7 +779,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu) + * involves poking the GIC, which must be done in a + * non-preemptible context. + */ +- preempt_disable(); ++ migrate_disable(); + + kvm_pmu_flush_hwstate(vcpu); + +@@ -828,7 +828,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu) + kvm_timer_sync_user(vcpu); + kvm_vgic_sync_hwstate(vcpu); + local_irq_enable(); +- preempt_enable(); ++ migrate_enable(); + continue; + } + +@@ -907,7 +907,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu) + /* Exit types that need handling before we can be preempted */ + handle_exit_early(vcpu, ret); + +- preempt_enable(); ++ migrate_enable(); + + /* + * The ARMv8 architecture doesn't give the hypervisor +diff --git a/arch/csky/Kconfig b/arch/csky/Kconfig +index 7bf0a617e..c9f2533cc 100644 +--- a/arch/csky/Kconfig ++++ b/arch/csky/Kconfig +@@ -286,6 +286,7 @@ config NR_CPUS + config HIGHMEM + bool "High Memory Support" + depends on !CPU_CK610 ++ select KMAP_LOCAL + default y + + config FORCE_MAX_ZONEORDER +diff --git a/arch/csky/include/asm/fixmap.h b/arch/csky/include/asm/fixmap.h +index 81f9477d5..4b589cc20 100644 +--- a/arch/csky/include/asm/fixmap.h ++++ b/arch/csky/include/asm/fixmap.h +@@ -8,7 +8,7 @@ + #include + #ifdef CONFIG_HIGHMEM + #include +-#include ++#include + #endif + + enum fixed_addresses { +@@ -17,7 +17,7 @@ enum fixed_addresses { + #endif + #ifdef CONFIG_HIGHMEM + FIX_KMAP_BEGIN, +- FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_TYPE_NR * NR_CPUS) - 1, ++ FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_MAX_IDX * NR_CPUS) - 1, + #endif + __end_of_fixed_addresses + }; +diff --git a/arch/csky/include/asm/highmem.h b/arch/csky/include/asm/highmem.h +index 14645e3d5..1f4ed3f4c 100644 +--- a/arch/csky/include/asm/highmem.h ++++ b/arch/csky/include/asm/highmem.h +@@ -9,7 +9,7 @@ + #include + #include + #include +-#include ++#include + #include + + /* undef for production */ +@@ -32,10 +32,12 @@ extern pte_t *pkmap_page_table; + + #define ARCH_HAS_KMAP_FLUSH_TLB + extern void kmap_flush_tlb(unsigned long addr); +-extern void *kmap_atomic_pfn(unsigned long pfn); + + #define flush_cache_kmaps() do {} while (0) + ++#define arch_kmap_local_post_map(vaddr, pteval) kmap_flush_tlb(vaddr) ++#define arch_kmap_local_post_unmap(vaddr) kmap_flush_tlb(vaddr) ++ + extern void kmap_init(void); + + #endif /* __KERNEL__ */ +diff --git a/arch/csky/mm/highmem.c b/arch/csky/mm/highmem.c +index 89c10800a..4161df3c6 100644 +--- a/arch/csky/mm/highmem.c ++++ b/arch/csky/mm/highmem.c +@@ -9,8 +9,6 @@ + #include + #include + +-static pte_t *kmap_pte; +- + unsigned long highstart_pfn, highend_pfn; + + void kmap_flush_tlb(unsigned long addr) +@@ -19,67 +17,7 @@ void kmap_flush_tlb(unsigned long addr) + } + EXPORT_SYMBOL(kmap_flush_tlb); + +-void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) +-{ +- unsigned long vaddr; +- int idx, type; +- +- type = kmap_atomic_idx_push(); +- idx = type + KM_TYPE_NR*smp_processor_id(); +- vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); +-#ifdef CONFIG_DEBUG_HIGHMEM +- BUG_ON(!pte_none(*(kmap_pte - idx))); +-#endif +- set_pte(kmap_pte-idx, mk_pte(page, prot)); +- flush_tlb_one((unsigned long)vaddr); +- +- return (void *)vaddr; +-} +-EXPORT_SYMBOL(kmap_atomic_high_prot); +- +-void kunmap_atomic_high(void *kvaddr) +-{ +- unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; +- int idx; +- +- if (vaddr < FIXADDR_START) +- return; +- +-#ifdef CONFIG_DEBUG_HIGHMEM +- idx = KM_TYPE_NR*smp_processor_id() + kmap_atomic_idx(); +- +- BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx)); +- +- pte_clear(&init_mm, vaddr, kmap_pte - idx); +- flush_tlb_one(vaddr); +-#else +- (void) idx; /* to kill a warning */ +-#endif +- kmap_atomic_idx_pop(); +-} +-EXPORT_SYMBOL(kunmap_atomic_high); +- +-/* +- * This is the same as kmap_atomic() but can map memory that doesn't +- * have a struct page associated with it. +- */ +-void *kmap_atomic_pfn(unsigned long pfn) +-{ +- unsigned long vaddr; +- int idx, type; +- +- pagefault_disable(); +- +- type = kmap_atomic_idx_push(); +- idx = type + KM_TYPE_NR*smp_processor_id(); +- vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); +- set_pte(kmap_pte-idx, pfn_pte(pfn, PAGE_KERNEL)); +- flush_tlb_one(vaddr); +- +- return (void *) vaddr; +-} +- +-static void __init kmap_pages_init(void) ++void __init kmap_init(void) + { + unsigned long vaddr; + pgd_t *pgd; +@@ -96,14 +34,3 @@ static void __init kmap_pages_init(void) + pte = pte_offset_kernel(pmd, vaddr); + pkmap_page_table = pte; + } +- +-void __init kmap_init(void) +-{ +- unsigned long vaddr; +- +- kmap_pages_init(); +- +- vaddr = __fix_to_virt(FIX_KMAP_BEGIN); +- +- kmap_pte = pte_offset_kernel((pmd_t *)pgd_offset_k(vaddr), vaddr); +-} +diff --git a/arch/hexagon/include/asm/spinlock_types.h b/arch/hexagon/include/asm/spinlock_types.h +index 19d233497..de72fb230 100644 +--- a/arch/hexagon/include/asm/spinlock_types.h ++++ b/arch/hexagon/include/asm/spinlock_types.h +@@ -8,10 +8,6 @@ + #ifndef _ASM_SPINLOCK_TYPES_H + #define _ASM_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + typedef struct { + volatile unsigned int lock; + } arch_spinlock_t; +diff --git a/arch/ia64/include/asm/kmap_types.h b/arch/ia64/include/asm/kmap_types.h +deleted file mode 100644 +index 5c268cf7c..000000000 +--- a/arch/ia64/include/asm/kmap_types.h ++++ /dev/null +@@ -1,13 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0 */ +-#ifndef _ASM_IA64_KMAP_TYPES_H +-#define _ASM_IA64_KMAP_TYPES_H +- +-#ifdef CONFIG_DEBUG_HIGHMEM +-#define __WITH_KM_FENCE +-#endif +- +-#include +- +-#undef __WITH_KM_FENCE +- +-#endif /* _ASM_IA64_KMAP_TYPES_H */ +diff --git a/arch/ia64/include/asm/spinlock_types.h b/arch/ia64/include/asm/spinlock_types.h +index 6e345fefc..681408d68 100644 +--- a/arch/ia64/include/asm/spinlock_types.h ++++ b/arch/ia64/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef _ASM_IA64_SPINLOCK_TYPES_H + #define _ASM_IA64_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + typedef struct { + volatile unsigned int lock; + } arch_spinlock_t; +diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c +index 7abc5f37b..733e0e332 100644 +--- a/arch/ia64/kernel/time.c ++++ b/arch/ia64/kernel/time.c +@@ -138,12 +138,8 @@ void vtime_account_kernel(struct task_struct *tsk) + struct thread_info *ti = task_thread_info(tsk); + __u64 stime = vtime_delta(tsk); + +- if ((tsk->flags & PF_VCPU) && !irq_count()) ++ if (tsk->flags & PF_VCPU) + ti->gtime += stime; +- else if (hardirq_count()) +- ti->hardirq_time += stime; +- else if (in_serving_softirq()) +- ti->softirq_time += stime; + else + ti->stime += stime; + } +@@ -156,6 +152,20 @@ void vtime_account_idle(struct task_struct *tsk) + ti->idle_time += vtime_delta(tsk); + } + ++void vtime_account_softirq(struct task_struct *tsk) ++{ ++ struct thread_info *ti = task_thread_info(tsk); ++ ++ ti->softirq_time += vtime_delta(tsk); ++} ++ ++void vtime_account_hardirq(struct task_struct *tsk) ++{ ++ struct thread_info *ti = task_thread_info(tsk); ++ ++ ti->hardirq_time += vtime_delta(tsk); ++} ++ + #endif /* CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */ + + static irqreturn_t +diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig +index 33925ffed..7f6ca0ab4 100644 +--- a/arch/microblaze/Kconfig ++++ b/arch/microblaze/Kconfig +@@ -155,6 +155,7 @@ config XILINX_UNCACHED_SHADOW + config HIGHMEM + bool "High memory support" + depends on MMU ++ select KMAP_LOCAL + help + The address space of Microblaze processors is only 4 Gigabytes large + and it has to accommodate user address space, kernel address +diff --git a/arch/microblaze/include/asm/fixmap.h b/arch/microblaze/include/asm/fixmap.h +index 0379ce522..e6e9288bf 100644 +--- a/arch/microblaze/include/asm/fixmap.h ++++ b/arch/microblaze/include/asm/fixmap.h +@@ -20,7 +20,7 @@ + #include + #ifdef CONFIG_HIGHMEM + #include +-#include ++#include + #endif + + #define FIXADDR_TOP ((unsigned long)(-PAGE_SIZE)) +@@ -47,7 +47,7 @@ enum fixed_addresses { + FIX_HOLE, + #ifdef CONFIG_HIGHMEM + FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */ +- FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_TYPE_NR * num_possible_cpus()) - 1, ++ FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_MAX_IDX * num_possible_cpus()) - 1, + #endif + __end_of_fixed_addresses + }; +diff --git a/arch/microblaze/include/asm/highmem.h b/arch/microblaze/include/asm/highmem.h +index 284ca8fb5..4418633fb 100644 +--- a/arch/microblaze/include/asm/highmem.h ++++ b/arch/microblaze/include/asm/highmem.h +@@ -25,7 +25,6 @@ + #include + #include + +-extern pte_t *kmap_pte; + extern pte_t *pkmap_page_table; + + /* +@@ -52,6 +51,11 @@ extern pte_t *pkmap_page_table; + + #define flush_cache_kmaps() { flush_icache(); flush_dcache(); } + ++#define arch_kmap_local_post_map(vaddr, pteval) \ ++ local_flush_tlb_page(NULL, vaddr); ++#define arch_kmap_local_post_unmap(vaddr) \ ++ local_flush_tlb_page(NULL, vaddr); ++ + #endif /* __KERNEL__ */ + + #endif /* _ASM_HIGHMEM_H */ +diff --git a/arch/microblaze/mm/Makefile b/arch/microblaze/mm/Makefile +index 1b16875ce..8ced71100 100644 +--- a/arch/microblaze/mm/Makefile ++++ b/arch/microblaze/mm/Makefile +@@ -6,4 +6,3 @@ + obj-y := consistent.o init.o + + obj-$(CONFIG_MMU) += pgtable.o mmu_context.o fault.o +-obj-$(CONFIG_HIGHMEM) += highmem.o +diff --git a/arch/microblaze/mm/highmem.c b/arch/microblaze/mm/highmem.c +deleted file mode 100644 +index 92e089041..000000000 +--- a/arch/microblaze/mm/highmem.c ++++ /dev/null +@@ -1,78 +0,0 @@ +-// SPDX-License-Identifier: GPL-2.0 +-/* +- * highmem.c: virtual kernel memory mappings for high memory +- * +- * PowerPC version, stolen from the i386 version. +- * +- * Used in CONFIG_HIGHMEM systems for memory pages which +- * are not addressable by direct kernel virtual addresses. +- * +- * Copyright (C) 1999 Gerhard Wichert, Siemens AG +- * Gerhard.Wichert@pdb.siemens.de +- * +- * +- * Redesigned the x86 32-bit VM architecture to deal with +- * up to 16 Terrabyte physical memory. With current x86 CPUs +- * we now support up to 64 Gigabytes physical RAM. +- * +- * Copyright (C) 1999 Ingo Molnar +- * +- * Reworked for PowerPC by various contributors. Moved from +- * highmem.h by Benjamin Herrenschmidt (c) 2009 IBM Corp. +- */ +- +-#include +-#include +- +-/* +- * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap +- * gives a more generic (and caching) interface. But kmap_atomic can +- * be used in IRQ contexts, so in some (very limited) cases we need +- * it. +- */ +-#include +- +-void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) +-{ +- +- unsigned long vaddr; +- int idx, type; +- +- type = kmap_atomic_idx_push(); +- idx = type + KM_TYPE_NR*smp_processor_id(); +- vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); +-#ifdef CONFIG_DEBUG_HIGHMEM +- BUG_ON(!pte_none(*(kmap_pte-idx))); +-#endif +- set_pte_at(&init_mm, vaddr, kmap_pte-idx, mk_pte(page, prot)); +- local_flush_tlb_page(NULL, vaddr); +- +- return (void *) vaddr; +-} +-EXPORT_SYMBOL(kmap_atomic_high_prot); +- +-void kunmap_atomic_high(void *kvaddr) +-{ +- unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; +- int type; +- unsigned int idx; +- +- if (vaddr < __fix_to_virt(FIX_KMAP_END)) +- return; +- +- type = kmap_atomic_idx(); +- +- idx = type + KM_TYPE_NR * smp_processor_id(); +-#ifdef CONFIG_DEBUG_HIGHMEM +- BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx)); +-#endif +- /* +- * force other mappings to Oops if they'll try to access +- * this pte without first remap it +- */ +- pte_clear(&init_mm, vaddr, kmap_pte-idx); +- local_flush_tlb_page(NULL, vaddr); +- +- kmap_atomic_idx_pop(); +-} +-EXPORT_SYMBOL(kunmap_atomic_high); +diff --git a/arch/microblaze/mm/init.c b/arch/microblaze/mm/init.c +index 45da639bd..1f4b5b34e 100644 +--- a/arch/microblaze/mm/init.c ++++ b/arch/microblaze/mm/init.c +@@ -49,17 +49,11 @@ unsigned long lowmem_size; + EXPORT_SYMBOL(min_low_pfn); + EXPORT_SYMBOL(max_low_pfn); + +-#ifdef CONFIG_HIGHMEM +-pte_t *kmap_pte; +-EXPORT_SYMBOL(kmap_pte); +- + static void __init highmem_init(void) + { + pr_debug("%x\n", (u32)PKMAP_BASE); + map_page(PKMAP_BASE, 0, 0); /* XXX gross */ + pkmap_page_table = virt_to_kpte(PKMAP_BASE); +- +- kmap_pte = virt_to_kpte(__fix_to_virt(FIX_KMAP_BEGIN)); + } + + static void highmem_setup(void) +diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig +index bd4bb55ae..00398c6d4 100644 +--- a/arch/mips/Kconfig ++++ b/arch/mips/Kconfig +@@ -2723,6 +2723,7 @@ config WAR_MIPS34K_MISSED_ITLB + config HIGHMEM + bool "High Memory Support" + depends on 32BIT && CPU_SUPPORTS_HIGHMEM && SYS_SUPPORTS_HIGHMEM && !CPU_MIPS32_3_5_EVA ++ select KMAP_LOCAL + + config CPU_SUPPORTS_HIGHMEM + bool +diff --git a/arch/mips/include/asm/fixmap.h b/arch/mips/include/asm/fixmap.h +index 743535be7..beea14761 100644 +--- a/arch/mips/include/asm/fixmap.h ++++ b/arch/mips/include/asm/fixmap.h +@@ -17,7 +17,7 @@ + #include + #ifdef CONFIG_HIGHMEM + #include +-#include ++#include + #endif + + /* +@@ -52,7 +52,7 @@ enum fixed_addresses { + #ifdef CONFIG_HIGHMEM + /* reserved pte's for temporary kernel mappings */ + FIX_KMAP_BEGIN = FIX_CMAP_END + 1, +- FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, ++ FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_MAX_IDX * NR_CPUS) - 1, + #endif + __end_of_fixed_addresses + }; +diff --git a/arch/mips/include/asm/highmem.h b/arch/mips/include/asm/highmem.h +index 9f021cf51..1716181ea 100644 +--- a/arch/mips/include/asm/highmem.h ++++ b/arch/mips/include/asm/highmem.h +@@ -24,7 +24,7 @@ + #include + #include + #include +-#include ++#include + + /* declarations for highmem.c */ + extern unsigned long highstart_pfn, highend_pfn; +@@ -48,11 +48,11 @@ extern pte_t *pkmap_page_table; + + #define ARCH_HAS_KMAP_FLUSH_TLB + extern void kmap_flush_tlb(unsigned long addr); +-extern void *kmap_atomic_pfn(unsigned long pfn); + + #define flush_cache_kmaps() BUG_ON(cpu_has_dc_aliases) + +-extern void kmap_init(void); ++#define arch_kmap_local_post_map(vaddr, pteval) local_flush_tlb_one(vaddr) ++#define arch_kmap_local_post_unmap(vaddr) local_flush_tlb_one(vaddr) + + #endif /* __KERNEL__ */ + +diff --git a/arch/mips/include/asm/kmap_types.h b/arch/mips/include/asm/kmap_types.h +deleted file mode 100644 +index 16665dc24..000000000 +--- a/arch/mips/include/asm/kmap_types.h ++++ /dev/null +@@ -1,13 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0 */ +-#ifndef _ASM_KMAP_TYPES_H +-#define _ASM_KMAP_TYPES_H +- +-#ifdef CONFIG_DEBUG_HIGHMEM +-#define __WITH_KM_FENCE +-#endif +- +-#include +- +-#undef __WITH_KM_FENCE +- +-#endif +diff --git a/arch/mips/kernel/crash_dump.c b/arch/mips/kernel/crash_dump.c +index 01b2bd95b..9aba83e1e 100644 +--- a/arch/mips/kernel/crash_dump.c ++++ b/arch/mips/kernel/crash_dump.c +@@ -5,8 +5,6 @@ + #include + #include + +-static void *kdump_buf_page; +- + /** + * copy_oldmem_page - copy one page from "oldmem" + * @pfn: page frame number to be copied +@@ -17,51 +15,25 @@ static void *kdump_buf_page; + * @userbuf: if set, @buf is in user address space, use copy_to_user(), + * otherwise @buf is in kernel address space, use memcpy(). + * +- * Copy a page from "oldmem". For this page, there is no pte mapped ++ * Copy a page from "oldmem". For this page, there might be no pte mapped + * in the current kernel. +- * +- * Calling copy_to_user() in atomic context is not desirable. Hence first +- * copying the data to a pre-allocated kernel page and then copying to user +- * space in non-atomic context. + */ +-ssize_t copy_oldmem_page(unsigned long pfn, char *buf, +- size_t csize, unsigned long offset, int userbuf) ++ssize_t copy_oldmem_page(unsigned long pfn, char *buf, size_t csize, ++ unsigned long offset, int userbuf) + { + void *vaddr; + + if (!csize) + return 0; + +- vaddr = kmap_atomic_pfn(pfn); ++ vaddr = kmap_local_pfn(pfn); + + if (!userbuf) { +- memcpy(buf, (vaddr + offset), csize); +- kunmap_atomic(vaddr); ++ memcpy(buf, vaddr + offset, csize); + } else { +- if (!kdump_buf_page) { +- pr_warn("Kdump: Kdump buffer page not allocated\n"); +- +- return -EFAULT; +- } +- copy_page(kdump_buf_page, vaddr); +- kunmap_atomic(vaddr); +- if (copy_to_user(buf, (kdump_buf_page + offset), csize)) +- return -EFAULT; ++ if (copy_to_user(buf, vaddr + offset, csize)) ++ csize = -EFAULT; + } + + return csize; + } +- +-static int __init kdump_buf_page_init(void) +-{ +- int ret = 0; +- +- kdump_buf_page = kmalloc(PAGE_SIZE, GFP_KERNEL); +- if (!kdump_buf_page) { +- pr_warn("Kdump: Failed to allocate kdump buffer page\n"); +- ret = -ENOMEM; +- } +- +- return ret; +-} +-arch_initcall(kdump_buf_page_init); +diff --git a/arch/mips/mm/highmem.c b/arch/mips/mm/highmem.c +index 5fec7f45d..57e2f08f0 100644 +--- a/arch/mips/mm/highmem.c ++++ b/arch/mips/mm/highmem.c +@@ -8,8 +8,6 @@ + #include + #include + +-static pte_t *kmap_pte; +- + unsigned long highstart_pfn, highend_pfn; + + void kmap_flush_tlb(unsigned long addr) +@@ -17,78 +15,3 @@ void kmap_flush_tlb(unsigned long addr) + flush_tlb_one(addr); + } + EXPORT_SYMBOL(kmap_flush_tlb); +- +-void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) +-{ +- unsigned long vaddr; +- int idx, type; +- +- type = kmap_atomic_idx_push(); +- idx = type + KM_TYPE_NR*smp_processor_id(); +- vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); +-#ifdef CONFIG_DEBUG_HIGHMEM +- BUG_ON(!pte_none(*(kmap_pte - idx))); +-#endif +- set_pte(kmap_pte-idx, mk_pte(page, prot)); +- local_flush_tlb_one((unsigned long)vaddr); +- +- return (void*) vaddr; +-} +-EXPORT_SYMBOL(kmap_atomic_high_prot); +- +-void kunmap_atomic_high(void *kvaddr) +-{ +- unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; +- int type __maybe_unused; +- +- if (vaddr < FIXADDR_START) +- return; +- +- type = kmap_atomic_idx(); +-#ifdef CONFIG_DEBUG_HIGHMEM +- { +- int idx = type + KM_TYPE_NR * smp_processor_id(); +- +- BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx)); +- +- /* +- * force other mappings to Oops if they'll try to access +- * this pte without first remap it +- */ +- pte_clear(&init_mm, vaddr, kmap_pte-idx); +- local_flush_tlb_one(vaddr); +- } +-#endif +- kmap_atomic_idx_pop(); +-} +-EXPORT_SYMBOL(kunmap_atomic_high); +- +-/* +- * This is the same as kmap_atomic() but can map memory that doesn't +- * have a struct page associated with it. +- */ +-void *kmap_atomic_pfn(unsigned long pfn) +-{ +- unsigned long vaddr; +- int idx, type; +- +- preempt_disable(); +- pagefault_disable(); +- +- type = kmap_atomic_idx_push(); +- idx = type + KM_TYPE_NR*smp_processor_id(); +- vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); +- set_pte(kmap_pte-idx, pfn_pte(pfn, PAGE_KERNEL)); +- flush_tlb_one(vaddr); +- +- return (void*) vaddr; +-} +- +-void __init kmap_init(void) +-{ +- unsigned long kmap_vstart; +- +- /* cache the first kmap pte */ +- kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN); +- kmap_pte = virt_to_kpte(kmap_vstart); +-} +diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c +index 07e84a774..bc80893e5 100644 +--- a/arch/mips/mm/init.c ++++ b/arch/mips/mm/init.c +@@ -36,7 +36,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -402,9 +401,6 @@ void __init paging_init(void) + + pagetable_init(); + +-#ifdef CONFIG_HIGHMEM +- kmap_init(); +-#endif + #ifdef CONFIG_ZONE_DMA + max_zone_pfns[ZONE_DMA] = MAX_DMA_PFN; + #endif +diff --git a/arch/nds32/Kconfig.cpu b/arch/nds32/Kconfig.cpu +index f88a12fdf..c10759952 100644 +--- a/arch/nds32/Kconfig.cpu ++++ b/arch/nds32/Kconfig.cpu +@@ -157,6 +157,7 @@ config HW_SUPPORT_UNALIGNMENT_ACCESS + config HIGHMEM + bool "High Memory Support" + depends on MMU && !CPU_CACHE_ALIASING ++ select KMAP_LOCAL + help + The address space of Andes processors is only 4 Gigabytes large + and it has to accommodate user address space, kernel address +diff --git a/arch/nds32/include/asm/fixmap.h b/arch/nds32/include/asm/fixmap.h +index 5a4bf11e5..2fa09a2de 100644 +--- a/arch/nds32/include/asm/fixmap.h ++++ b/arch/nds32/include/asm/fixmap.h +@@ -6,7 +6,7 @@ + + #ifdef CONFIG_HIGHMEM + #include +-#include ++#include + #endif + + enum fixed_addresses { +@@ -14,7 +14,7 @@ enum fixed_addresses { + FIX_KMAP_RESERVED, + FIX_KMAP_BEGIN, + #ifdef CONFIG_HIGHMEM +- FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_TYPE_NR * NR_CPUS), ++ FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_MAX_IDX * NR_CPUS) - 1, + #endif + FIX_EARLYCON_MEM_BASE, + __end_of_fixed_addresses +diff --git a/arch/nds32/include/asm/highmem.h b/arch/nds32/include/asm/highmem.h +index fe986d0e6..16159a871 100644 +--- a/arch/nds32/include/asm/highmem.h ++++ b/arch/nds32/include/asm/highmem.h +@@ -5,7 +5,6 @@ + #define _ASM_HIGHMEM_H + + #include +-#include + #include + + /* +@@ -45,11 +44,22 @@ extern pte_t *pkmap_page_table; + extern void kmap_init(void); + + /* +- * The following functions are already defined by +- * when CONFIG_HIGHMEM is not set. ++ * FIXME: The below looks broken vs. a kmap_atomic() in task context which ++ * is interupted and another kmap_atomic() happens in interrupt context. ++ * But what do I know about nds32. -- tglx + */ +-#ifdef CONFIG_HIGHMEM +-extern void *kmap_atomic_pfn(unsigned long pfn); +-#endif ++#define arch_kmap_local_post_map(vaddr, pteval) \ ++ do { \ ++ __nds32__tlbop_inv(vaddr); \ ++ __nds32__mtsr_dsb(vaddr, NDS32_SR_TLB_VPN); \ ++ __nds32__tlbop_rwr(pteval); \ ++ __nds32__isb(); \ ++ } while (0) ++ ++#define arch_kmap_local_pre_unmap(vaddr) \ ++ do { \ ++ __nds32__tlbop_inv(vaddr); \ ++ __nds32__isb(); \ ++ } while (0) + + #endif +diff --git a/arch/nds32/mm/Makefile b/arch/nds32/mm/Makefile +index 897ecaf5c..14fb2e8eb 100644 +--- a/arch/nds32/mm/Makefile ++++ b/arch/nds32/mm/Makefile +@@ -3,7 +3,6 @@ obj-y := extable.o tlb.o fault.o init.o mmap.o \ + mm-nds32.o cacheflush.o proc.o + + obj-$(CONFIG_ALIGNMENT_TRAP) += alignment.o +-obj-$(CONFIG_HIGHMEM) += highmem.o + + ifdef CONFIG_FUNCTION_TRACER + CFLAGS_REMOVE_proc.o = $(CC_FLAGS_FTRACE) +diff --git a/arch/nds32/mm/highmem.c b/arch/nds32/mm/highmem.c +deleted file mode 100644 +index 4284cd59e..000000000 +--- a/arch/nds32/mm/highmem.c ++++ /dev/null +@@ -1,48 +0,0 @@ +-// SPDX-License-Identifier: GPL-2.0 +-// Copyright (C) 2005-2017 Andes Technology Corporation +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) +-{ +- unsigned int idx; +- unsigned long vaddr, pte; +- int type; +- pte_t *ptep; +- +- type = kmap_atomic_idx_push(); +- +- idx = type + KM_TYPE_NR * smp_processor_id(); +- vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); +- pte = (page_to_pfn(page) << PAGE_SHIFT) | prot; +- ptep = pte_offset_kernel(pmd_off_k(vaddr), vaddr); +- set_pte(ptep, pte); +- +- __nds32__tlbop_inv(vaddr); +- __nds32__mtsr_dsb(vaddr, NDS32_SR_TLB_VPN); +- __nds32__tlbop_rwr(pte); +- __nds32__isb(); +- return (void *)vaddr; +-} +-EXPORT_SYMBOL(kmap_atomic_high_prot); +- +-void kunmap_atomic_high(void *kvaddr) +-{ +- if (kvaddr >= (void *)FIXADDR_START) { +- unsigned long vaddr = (unsigned long)kvaddr; +- pte_t *ptep; +- kmap_atomic_idx_pop(); +- __nds32__tlbop_inv(vaddr); +- __nds32__isb(); +- ptep = pte_offset_kernel(pmd_off_k(vaddr), vaddr); +- set_pte(ptep, 0); +- } +-} +-EXPORT_SYMBOL(kunmap_atomic_high); +diff --git a/arch/openrisc/mm/init.c b/arch/openrisc/mm/init.c +index 5e88c351e..f3fa02b88 100644 +--- a/arch/openrisc/mm/init.c ++++ b/arch/openrisc/mm/init.c +@@ -33,7 +33,6 @@ + #include + #include + #include +-#include + #include + #include + #include +diff --git a/arch/openrisc/mm/ioremap.c b/arch/openrisc/mm/ioremap.c +index a978590d8..5aed97a18 100644 +--- a/arch/openrisc/mm/ioremap.c ++++ b/arch/openrisc/mm/ioremap.c +@@ -15,7 +15,6 @@ + #include + #include + #include +-#include + #include + #include + #include +diff --git a/arch/parisc/include/asm/hardirq.h b/arch/parisc/include/asm/hardirq.h +index 7f7039516..fad29aa6f 100644 +--- a/arch/parisc/include/asm/hardirq.h ++++ b/arch/parisc/include/asm/hardirq.h +@@ -32,7 +32,6 @@ typedef struct { + DECLARE_PER_CPU_SHARED_ALIGNED(irq_cpustat_t, irq_stat); + + #define __ARCH_IRQ_STAT +-#define __IRQ_STAT(cpu, member) (irq_stat[cpu].member) + #define inc_irq_stat(member) this_cpu_inc(irq_stat.member) + #define __inc_irq_stat(member) __this_cpu_inc(irq_stat.member) + #define ack_bad_irq(irq) WARN(1, "unexpected IRQ trap at vector %02x\n", irq) +diff --git a/arch/parisc/include/asm/kmap_types.h b/arch/parisc/include/asm/kmap_types.h +deleted file mode 100644 +index 3e70b5cd1..000000000 +--- a/arch/parisc/include/asm/kmap_types.h ++++ /dev/null +@@ -1,13 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0 */ +-#ifndef _ASM_KMAP_TYPES_H +-#define _ASM_KMAP_TYPES_H +- +-#ifdef CONFIG_DEBUG_HIGHMEM +-#define __WITH_KM_FENCE +-#endif +- +-#include +- +-#undef __WITH_KM_FENCE +- +-#endif +diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig +index 4e6f30473..42851014e 100644 +--- a/arch/powerpc/Kconfig ++++ b/arch/powerpc/Kconfig +@@ -146,6 +146,7 @@ config PPC + select ARCH_MIGHT_HAVE_PC_SERIO + select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX + select ARCH_SUPPORTS_ATOMIC_RMW ++ select ARCH_SUPPORTS_RT if HAVE_POSIX_CPU_TIMERS_TASK_WORK + select ARCH_USE_BUILTIN_BSWAP + select ARCH_USE_CMPXCHG_LOCKREF if PPC64 + select ARCH_USE_QUEUED_RWLOCKS if PPC_QUEUED_SPINLOCKS +@@ -234,6 +235,7 @@ config PPC + select HAVE_HARDLOCKUP_DETECTOR_PERF if PERF_EVENTS && HAVE_PERF_EVENTS_NMI && !HAVE_HARDLOCKUP_DETECTOR_ARCH + select HAVE_PERF_REGS + select HAVE_PERF_USER_STACK_DUMP ++ select HAVE_PREEMPT_LAZY + select MMU_GATHER_RCU_TABLE_FREE + select MMU_GATHER_PAGE_SIZE + select HAVE_REGS_AND_STACK_ACCESS_API +@@ -241,6 +243,7 @@ config PPC + select HAVE_SYSCALL_TRACEPOINTS + select HAVE_VIRT_CPU_ACCOUNTING + select HAVE_IRQ_TIME_ACCOUNTING ++ select HAVE_POSIX_CPU_TIMERS_TASK_WORK if !KVM + select HAVE_RSEQ + select IOMMU_HELPER if PPC64 + select IRQ_DOMAIN +@@ -414,6 +417,7 @@ menu "Kernel options" + config HIGHMEM + bool "High memory support" + depends on PPC32 ++ select KMAP_LOCAL + + source "kernel/Kconfig.hz" + +diff --git a/arch/powerpc/include/asm/cmpxchg.h b/arch/powerpc/include/asm/cmpxchg.h +index cf091c4c2..7371f7e23 100644 +--- a/arch/powerpc/include/asm/cmpxchg.h ++++ b/arch/powerpc/include/asm/cmpxchg.h +@@ -5,7 +5,7 @@ + #ifdef __KERNEL__ + #include + #include +-#include ++#include + + #ifdef __BIG_ENDIAN + #define BITOFF_CAL(size, off) ((sizeof(u32) - size - off) * BITS_PER_BYTE) +diff --git a/arch/powerpc/include/asm/fixmap.h b/arch/powerpc/include/asm/fixmap.h +index 591b2f4de..947b5b9c4 100644 +--- a/arch/powerpc/include/asm/fixmap.h ++++ b/arch/powerpc/include/asm/fixmap.h +@@ -20,7 +20,7 @@ + #include + #ifdef CONFIG_HIGHMEM + #include +-#include ++#include + #endif + + #ifdef CONFIG_PPC64 +@@ -61,7 +61,7 @@ enum fixed_addresses { + FIX_EARLY_DEBUG_BASE = FIX_EARLY_DEBUG_TOP+(ALIGN(SZ_128K, PAGE_SIZE)/PAGE_SIZE)-1, + #ifdef CONFIG_HIGHMEM + FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */ +- FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, ++ FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_MAX_IDX * NR_CPUS) - 1, + #endif + #ifdef CONFIG_PPC_8xx + /* For IMMR we need an aligned 512K area */ +diff --git a/arch/powerpc/include/asm/highmem.h b/arch/powerpc/include/asm/highmem.h +index 104026f7d..80a5ae771 100644 +--- a/arch/powerpc/include/asm/highmem.h ++++ b/arch/powerpc/include/asm/highmem.h +@@ -24,12 +24,10 @@ + #ifdef __KERNEL__ + + #include +-#include + #include + #include + #include + +-extern pte_t *kmap_pte; + extern pte_t *pkmap_page_table; + + /* +@@ -60,6 +58,11 @@ extern pte_t *pkmap_page_table; + + #define flush_cache_kmaps() flush_cache_all() + ++#define arch_kmap_local_post_map(vaddr, pteval) \ ++ local_flush_tlb_page(NULL, vaddr) ++#define arch_kmap_local_post_unmap(vaddr) \ ++ local_flush_tlb_page(NULL, vaddr) ++ + #endif /* __KERNEL__ */ + + #endif /* _ASM_HIGHMEM_H */ +diff --git a/arch/powerpc/include/asm/kmap_types.h b/arch/powerpc/include/asm/kmap_types.h +deleted file mode 100644 +index c8fa182d4..000000000 +--- a/arch/powerpc/include/asm/kmap_types.h ++++ /dev/null +@@ -1,13 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0-or-later */ +-#ifndef _ASM_POWERPC_KMAP_TYPES_H +-#define _ASM_POWERPC_KMAP_TYPES_H +- +-#ifdef __KERNEL__ +- +-/* +- */ +- +-#define KM_TYPE_NR 16 +- +-#endif /* __KERNEL__ */ +-#endif /* _ASM_POWERPC_KMAP_TYPES_H */ +diff --git a/arch/powerpc/include/asm/simple_spinlock_types.h b/arch/powerpc/include/asm/simple_spinlock_types.h +index 0f3cdd8fa..d45561e9e 100644 +--- a/arch/powerpc/include/asm/simple_spinlock_types.h ++++ b/arch/powerpc/include/asm/simple_spinlock_types.h +@@ -2,7 +2,7 @@ + #ifndef _ASM_POWERPC_SIMPLE_SPINLOCK_TYPES_H + #define _ASM_POWERPC_SIMPLE_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H ++#if !defined(__LINUX_SPINLOCK_TYPES_H) && !defined(__LINUX_RT_MUTEX_H) + # error "please don't include this file directly" + #endif + +diff --git a/arch/powerpc/include/asm/spinlock_types.h b/arch/powerpc/include/asm/spinlock_types.h +index c5d742f18..cc6922a01 100644 +--- a/arch/powerpc/include/asm/spinlock_types.h ++++ b/arch/powerpc/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef _ASM_POWERPC_SPINLOCK_TYPES_H + #define _ASM_POWERPC_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + #ifdef CONFIG_PPC_QUEUED_SPINLOCKS + #include + #include +diff --git a/arch/powerpc/include/asm/stackprotector.h b/arch/powerpc/include/asm/stackprotector.h +index 1c8460e23..b1653c160 100644 +--- a/arch/powerpc/include/asm/stackprotector.h ++++ b/arch/powerpc/include/asm/stackprotector.h +@@ -24,7 +24,11 @@ static __always_inline void boot_init_stack_canary(void) + unsigned long canary; + + /* Try to get a semi random initial value. */ ++#ifdef CONFIG_PREEMPT_RT ++ canary = (unsigned long)&canary; ++#else + canary = get_random_canary(); ++#endif + canary ^= mftb(); + canary ^= LINUX_VERSION_CODE; + canary &= CANARY_MASK; +diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h +index 28d2908af..22e85007f 100644 +--- a/arch/powerpc/include/asm/thread_info.h ++++ b/arch/powerpc/include/asm/thread_info.h +@@ -48,6 +48,8 @@ + struct thread_info { + int preempt_count; /* 0 => preemptable, + <0 => BUG */ ++ int preempt_lazy_count; /* 0 => preemptable, ++ <0 => BUG */ + #ifdef CONFIG_SMP + unsigned int cpu; + #endif +@@ -100,11 +102,12 @@ void arch_setup_new_exec(void); + #define TIF_SINGLESTEP 8 /* singlestepping active */ + #define TIF_NOHZ 9 /* in adaptive nohz mode */ + #define TIF_SECCOMP 10 /* secure computing */ +-#define TIF_RESTOREALL 11 /* Restore all regs (implies NOERROR) */ +-#define TIF_NOERROR 12 /* Force successful syscall return */ ++ ++#define TIF_NEED_RESCHED_LAZY 11 /* lazy rescheduling necessary */ ++#define TIF_SYSCALL_TRACEPOINT 12 /* syscall tracepoint instrumentation */ ++ + #define TIF_NOTIFY_RESUME 13 /* callback before returning to user */ + #define TIF_UPROBE 14 /* breakpointed or single-stepping */ +-#define TIF_SYSCALL_TRACEPOINT 15 /* syscall tracepoint instrumentation */ + #define TIF_EMULATE_STACK_STORE 16 /* Is an instruction emulation + for stack store? */ + #define TIF_MEMDIE 17 /* is terminating due to OOM killer */ +@@ -113,6 +116,9 @@ void arch_setup_new_exec(void); + #endif + #define TIF_POLLING_NRFLAG 19 /* true if poll_idle() is polling TIF_NEED_RESCHED */ + #define TIF_32BIT 20 /* 32 bit binary */ ++#define TIF_RESTOREALL 21 /* Restore all regs (implies NOERROR) */ ++#define TIF_NOERROR 22 /* Force successful syscall return */ ++ + + /* as above, but as bit values */ + #define _TIF_SYSCALL_TRACE (1<version = cpu_to_be16(OOPS_HDR_VERSION); +diff --git a/arch/powerpc/kernel/syscall_64.c b/arch/powerpc/kernel/syscall_64.c +index 310bcd768..ae3212dcf 100644 +--- a/arch/powerpc/kernel/syscall_64.c ++++ b/arch/powerpc/kernel/syscall_64.c +@@ -193,7 +193,7 @@ notrace unsigned long syscall_exit_prepare(unsigned long r3, + ti_flags = READ_ONCE(*ti_flagsp); + while (unlikely(ti_flags & (_TIF_USER_WORK_MASK & ~_TIF_RESTORE_TM))) { + local_irq_enable(); +- if (ti_flags & _TIF_NEED_RESCHED) { ++ if (ti_flags & _TIF_NEED_RESCHED_MASK) { + schedule(); + } else { + /* +@@ -277,7 +277,7 @@ notrace unsigned long interrupt_exit_user_prepare(struct pt_regs *regs, unsigned + ti_flags = READ_ONCE(*ti_flagsp); + while (unlikely(ti_flags & (_TIF_USER_WORK_MASK & ~_TIF_RESTORE_TM))) { + local_irq_enable(); /* returning to user: may enable */ +- if (ti_flags & _TIF_NEED_RESCHED) { ++ if (ti_flags & _TIF_NEED_RESCHED_MASK) { + schedule(); + } else { + if (ti_flags & _TIF_SIGPENDING) +@@ -361,11 +361,15 @@ notrace unsigned long interrupt_exit_kernel_prepare(struct pt_regs *regs, unsign + /* Returning to a kernel context with local irqs enabled. */ + WARN_ON_ONCE(!(regs->msr & MSR_EE)); + again: +- if (IS_ENABLED(CONFIG_PREEMPT)) { ++ if (IS_ENABLED(CONFIG_PREEMPTION)) { + /* Return to preemptible kernel context */ + if (unlikely(*ti_flagsp & _TIF_NEED_RESCHED)) { + if (preempt_count() == 0) + preempt_schedule_irq(); ++ } else if (unlikely(*ti_flagsp & _TIF_NEED_RESCHED_LAZY)) { ++ if ((preempt_count() == 0) && ++ (current_thread_info()->preempt_lazy_count == 0)) ++ preempt_schedule_irq(); + } + } + +diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c +index 1d20f0f77..7e0a497a3 100644 +--- a/arch/powerpc/kernel/time.c ++++ b/arch/powerpc/kernel/time.c +@@ -312,12 +312,11 @@ static unsigned long vtime_delta_scaled(struct cpu_accounting_data *acct, + return stime_scaled; + } + +-static unsigned long vtime_delta(struct task_struct *tsk, ++static unsigned long vtime_delta(struct cpu_accounting_data *acct, + unsigned long *stime_scaled, + unsigned long *steal_time) + { + unsigned long now, stime; +- struct cpu_accounting_data *acct = get_accounting(tsk); + + WARN_ON_ONCE(!irqs_disabled()); + +@@ -332,29 +331,30 @@ static unsigned long vtime_delta(struct task_struct *tsk, + return stime; + } + ++static void vtime_delta_kernel(struct cpu_accounting_data *acct, ++ unsigned long *stime, unsigned long *stime_scaled) ++{ ++ unsigned long steal_time; ++ ++ *stime = vtime_delta(acct, stime_scaled, &steal_time); ++ *stime -= min(*stime, steal_time); ++ acct->steal_time += steal_time; ++} ++ + void vtime_account_kernel(struct task_struct *tsk) + { +- unsigned long stime, stime_scaled, steal_time; + struct cpu_accounting_data *acct = get_accounting(tsk); ++ unsigned long stime, stime_scaled; + +- stime = vtime_delta(tsk, &stime_scaled, &steal_time); +- +- stime -= min(stime, steal_time); +- acct->steal_time += steal_time; ++ vtime_delta_kernel(acct, &stime, &stime_scaled); + +- if ((tsk->flags & PF_VCPU) && !irq_count()) { ++ if (tsk->flags & PF_VCPU) { + acct->gtime += stime; + #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME + acct->utime_scaled += stime_scaled; + #endif + } else { +- if (hardirq_count()) +- acct->hardirq_time += stime; +- else if (in_serving_softirq()) +- acct->softirq_time += stime; +- else +- acct->stime += stime; +- ++ acct->stime += stime; + #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME + acct->stime_scaled += stime_scaled; + #endif +@@ -367,10 +367,34 @@ void vtime_account_idle(struct task_struct *tsk) + unsigned long stime, stime_scaled, steal_time; + struct cpu_accounting_data *acct = get_accounting(tsk); + +- stime = vtime_delta(tsk, &stime_scaled, &steal_time); ++ stime = vtime_delta(acct, &stime_scaled, &steal_time); + acct->idle_time += stime + steal_time; + } + ++static void vtime_account_irq_field(struct cpu_accounting_data *acct, ++ unsigned long *field) ++{ ++ unsigned long stime, stime_scaled; ++ ++ vtime_delta_kernel(acct, &stime, &stime_scaled); ++ *field += stime; ++#ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME ++ acct->stime_scaled += stime_scaled; ++#endif ++} ++ ++void vtime_account_softirq(struct task_struct *tsk) ++{ ++ struct cpu_accounting_data *acct = get_accounting(tsk); ++ vtime_account_irq_field(acct, &acct->softirq_time); ++} ++ ++void vtime_account_hardirq(struct task_struct *tsk) ++{ ++ struct cpu_accounting_data *acct = get_accounting(tsk); ++ vtime_account_irq_field(acct, &acct->hardirq_time); ++} ++ + static void vtime_flush_scaled(struct task_struct *tsk, + struct cpu_accounting_data *acct) + { +diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c +index 77dffea3d..34861e39d 100644 +--- a/arch/powerpc/kernel/traps.c ++++ b/arch/powerpc/kernel/traps.c +@@ -170,7 +170,6 @@ extern void panic_flush_kmsg_start(void) + + extern void panic_flush_kmsg_end(void) + { +- printk_safe_flush_on_panic(); + kmsg_dump(KMSG_DUMP_PANIC); + bust_spinlocks(0); + debug_locks_off(); +@@ -260,12 +259,17 @@ static char *get_mmu_str(void) + + static int __die(const char *str, struct pt_regs *regs, long err) + { ++ const char *pr = ""; ++ + printk("Oops: %s, sig: %ld [#%d]\n", str, err, ++die_counter); + ++ if (IS_ENABLED(CONFIG_PREEMPTION)) ++ pr = IS_ENABLED(CONFIG_PREEMPT_RT) ? " PREEMPT_RT" : " PREEMPT"; ++ + printk("%s PAGE_SIZE=%luK%s%s%s%s%s%s %s\n", + IS_ENABLED(CONFIG_CPU_LITTLE_ENDIAN) ? "LE" : "BE", + PAGE_SIZE / 1024, get_mmu_str(), +- IS_ENABLED(CONFIG_PREEMPT) ? " PREEMPT" : "", ++ pr, + IS_ENABLED(CONFIG_SMP) ? " SMP" : "", + IS_ENABLED(CONFIG_SMP) ? (" NR_CPUS=" __stringify(NR_CPUS)) : "", + debug_pagealloc_enabled() ? " DEBUG_PAGEALLOC" : "", +diff --git a/arch/powerpc/kernel/watchdog.c b/arch/powerpc/kernel/watchdog.c +index af3c15a1d..8ae46c594 100644 +--- a/arch/powerpc/kernel/watchdog.c ++++ b/arch/powerpc/kernel/watchdog.c +@@ -181,11 +181,6 @@ static void watchdog_smp_panic(int cpu, u64 tb) + + wd_smp_unlock(&flags); + +- printk_safe_flush(); +- /* +- * printk_safe_flush() seems to require another print +- * before anything actually goes out to console. +- */ + if (sysctl_hardlockup_all_cpu_backtrace) + trigger_allbutself_cpu_backtrace(); + +diff --git a/arch/powerpc/kexec/crash.c b/arch/powerpc/kexec/crash.c +index c9a889880..d488311ef 100644 +--- a/arch/powerpc/kexec/crash.c ++++ b/arch/powerpc/kexec/crash.c +@@ -311,9 +311,6 @@ void default_machine_crash_shutdown(struct pt_regs *regs) + unsigned int i; + int (*old_handler)(struct pt_regs *regs); + +- /* Avoid hardlocking with irresponsive CPU holding logbuf_lock */ +- printk_nmi_enter(); +- + /* + * This function is only called after the system + * has panicked or is otherwise in a critical state. +diff --git a/arch/powerpc/kvm/Kconfig b/arch/powerpc/kvm/Kconfig +index 549591d9a..efb5bfe93 100644 +--- a/arch/powerpc/kvm/Kconfig ++++ b/arch/powerpc/kvm/Kconfig +@@ -178,6 +178,7 @@ config KVM_E500MC + config KVM_MPIC + bool "KVM in-kernel MPIC emulation" + depends on KVM && E500 ++ depends on !PREEMPT_RT + select HAVE_KVM_IRQCHIP + select HAVE_KVM_IRQFD + select HAVE_KVM_IRQ_ROUTING +diff --git a/arch/powerpc/mm/Makefile b/arch/powerpc/mm/Makefile +index 55b4a8bd4..3b4e9e4e2 100644 +--- a/arch/powerpc/mm/Makefile ++++ b/arch/powerpc/mm/Makefile +@@ -16,7 +16,6 @@ obj-$(CONFIG_NEED_MULTIPLE_NODES) += numa.o + obj-$(CONFIG_PPC_MM_SLICES) += slice.o + obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o + obj-$(CONFIG_NOT_COHERENT_CACHE) += dma-noncoherent.o +-obj-$(CONFIG_HIGHMEM) += highmem.o + obj-$(CONFIG_PPC_COPRO_BASE) += copro_fault.o + obj-$(CONFIG_PPC_PTDUMP) += ptdump/ + obj-$(CONFIG_KASAN) += kasan/ +diff --git a/arch/powerpc/mm/highmem.c b/arch/powerpc/mm/highmem.c +deleted file mode 100644 +index 624b4438a..000000000 +--- a/arch/powerpc/mm/highmem.c ++++ /dev/null +@@ -1,67 +0,0 @@ +-// SPDX-License-Identifier: GPL-2.0 +-/* +- * highmem.c: virtual kernel memory mappings for high memory +- * +- * PowerPC version, stolen from the i386 version. +- * +- * Used in CONFIG_HIGHMEM systems for memory pages which +- * are not addressable by direct kernel virtual addresses. +- * +- * Copyright (C) 1999 Gerhard Wichert, Siemens AG +- * Gerhard.Wichert@pdb.siemens.de +- * +- * +- * Redesigned the x86 32-bit VM architecture to deal with +- * up to 16 Terrabyte physical memory. With current x86 CPUs +- * we now support up to 64 Gigabytes physical RAM. +- * +- * Copyright (C) 1999 Ingo Molnar +- * +- * Reworked for PowerPC by various contributors. Moved from +- * highmem.h by Benjamin Herrenschmidt (c) 2009 IBM Corp. +- */ +- +-#include +-#include +- +-void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) +-{ +- unsigned long vaddr; +- int idx, type; +- +- type = kmap_atomic_idx_push(); +- idx = type + KM_TYPE_NR*smp_processor_id(); +- vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); +- WARN_ON(IS_ENABLED(CONFIG_DEBUG_HIGHMEM) && !pte_none(*(kmap_pte - idx))); +- __set_pte_at(&init_mm, vaddr, kmap_pte-idx, mk_pte(page, prot), 1); +- local_flush_tlb_page(NULL, vaddr); +- +- return (void*) vaddr; +-} +-EXPORT_SYMBOL(kmap_atomic_high_prot); +- +-void kunmap_atomic_high(void *kvaddr) +-{ +- unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; +- +- if (vaddr < __fix_to_virt(FIX_KMAP_END)) +- return; +- +- if (IS_ENABLED(CONFIG_DEBUG_HIGHMEM)) { +- int type = kmap_atomic_idx(); +- unsigned int idx; +- +- idx = type + KM_TYPE_NR * smp_processor_id(); +- WARN_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx)); +- +- /* +- * force other mappings to Oops if they'll try to access +- * this pte without first remap it +- */ +- pte_clear(&init_mm, vaddr, kmap_pte-idx); +- local_flush_tlb_page(NULL, vaddr); +- } +- +- kmap_atomic_idx_pop(); +-} +-EXPORT_SYMBOL(kunmap_atomic_high); +diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c +index 22eb1c718..1b74565b3 100644 +--- a/arch/powerpc/mm/mem.c ++++ b/arch/powerpc/mm/mem.c +@@ -62,11 +62,6 @@ + unsigned long long memory_limit; + bool init_mem_is_free; + +-#ifdef CONFIG_HIGHMEM +-pte_t *kmap_pte; +-EXPORT_SYMBOL(kmap_pte); +-#endif +- + pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, + unsigned long size, pgprot_t vma_prot) + { +@@ -236,8 +231,6 @@ void __init paging_init(void) + + map_kernel_page(PKMAP_BASE, 0, __pgprot(0)); /* XXX gross */ + pkmap_page_table = virt_to_kpte(PKMAP_BASE); +- +- kmap_pte = virt_to_kpte(__fix_to_virt(FIX_KMAP_BEGIN)); + #endif /* CONFIG_HIGHMEM */ + + printk(KERN_DEBUG "Top of RAM: 0x%llx, Total RAM: 0x%llx\n", +diff --git a/arch/powerpc/platforms/powernv/opal-kmsg.c b/arch/powerpc/platforms/powernv/opal-kmsg.c +index 6c3bc4b4d..ec862846b 100644 +--- a/arch/powerpc/platforms/powernv/opal-kmsg.c ++++ b/arch/powerpc/platforms/powernv/opal-kmsg.c +@@ -20,7 +20,8 @@ + * message, it just ensures that OPAL completely flushes the console buffer. + */ + static void kmsg_dump_opal_console_flush(struct kmsg_dumper *dumper, +- enum kmsg_dump_reason reason) ++ enum kmsg_dump_reason reason, ++ struct kmsg_dumper_iter *iter) + { + /* + * Outside of a panic context the pollers will continue to run, +diff --git a/arch/powerpc/platforms/pseries/iommu.c b/arch/powerpc/platforms/pseries/iommu.c +index 245f1f8df..f05555dde 100644 +--- a/arch/powerpc/platforms/pseries/iommu.c ++++ b/arch/powerpc/platforms/pseries/iommu.c +@@ -24,6 +24,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -190,7 +191,13 @@ static int tce_build_pSeriesLP(unsigned long liobn, long tcenum, long tceshift, + return ret; + } + +-static DEFINE_PER_CPU(__be64 *, tce_page); ++struct tce_page { ++ __be64 * page; ++ local_lock_t lock; ++}; ++static DEFINE_PER_CPU(struct tce_page, tce_page) = { ++ .lock = INIT_LOCAL_LOCK(lock), ++}; + + static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, + long npages, unsigned long uaddr, +@@ -212,9 +219,10 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, + direction, attrs); + } + +- local_irq_save(flags); /* to protect tcep and the page behind it */ ++ /* to protect tcep and the page behind it */ ++ local_lock_irqsave(&tce_page.lock, flags); + +- tcep = __this_cpu_read(tce_page); ++ tcep = __this_cpu_read(tce_page.page); + + /* This is safe to do since interrupts are off when we're called + * from iommu_alloc{,_sg}() +@@ -223,12 +231,12 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, + tcep = (__be64 *)__get_free_page(GFP_ATOMIC); + /* If allocation fails, fall back to the loop implementation */ + if (!tcep) { +- local_irq_restore(flags); ++ local_unlock_irqrestore(&tce_page.lock, flags); + return tce_build_pSeriesLP(tbl->it_index, tcenum, + tbl->it_page_shift, + npages, uaddr, direction, attrs); + } +- __this_cpu_write(tce_page, tcep); ++ __this_cpu_write(tce_page.page, tcep); + } + + rpn = __pa(uaddr) >> TCE_SHIFT; +@@ -258,7 +266,7 @@ static int tce_buildmulti_pSeriesLP(struct iommu_table *tbl, long tcenum, + tcenum += limit; + } while (npages > 0 && !rc); + +- local_irq_restore(flags); ++ local_unlock_irqrestore(&tce_page.lock, flags); + + if (unlikely(rc == H_NOT_ENOUGH_RESOURCES)) { + ret = (int)rc; +@@ -429,16 +437,17 @@ static int tce_setrange_multi_pSeriesLP(unsigned long start_pfn, + DMA_BIDIRECTIONAL, 0); + } + +- local_irq_disable(); /* to protect tcep and the page behind it */ +- tcep = __this_cpu_read(tce_page); ++ /* to protect tcep and the page behind it */ ++ local_lock_irq(&tce_page.lock); ++ tcep = __this_cpu_read(tce_page.page); + + if (!tcep) { + tcep = (__be64 *)__get_free_page(GFP_ATOMIC); + if (!tcep) { +- local_irq_enable(); ++ local_unlock_irq(&tce_page.lock); + return -ENOMEM; + } +- __this_cpu_write(tce_page, tcep); ++ __this_cpu_write(tce_page.page, tcep); + } + + proto_tce = TCE_PCI_READ | TCE_PCI_WRITE; +@@ -481,7 +490,7 @@ static int tce_setrange_multi_pSeriesLP(unsigned long start_pfn, + + /* error cleanup: caller will clear whole range */ + +- local_irq_enable(); ++ local_unlock_irq(&tce_page.lock); + return rc; + } + +diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c +index 5559edf36..d62b8e053 100644 +--- a/arch/powerpc/xmon/xmon.c ++++ b/arch/powerpc/xmon/xmon.c +@@ -3005,7 +3005,7 @@ print_address(unsigned long addr) + static void + dump_log_buf(void) + { +- struct kmsg_dumper dumper = { .active = 1 }; ++ struct kmsg_dumper_iter iter = { .active = 1 }; + unsigned char buf[128]; + size_t len; + +@@ -3017,9 +3017,9 @@ dump_log_buf(void) + catch_memory_errors = 1; + sync(); + +- kmsg_dump_rewind_nolock(&dumper); ++ kmsg_dump_rewind(&iter); + xmon_start_pagination(); +- while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) { ++ while (kmsg_dump_get_line(&iter, false, buf, sizeof(buf), &len)) { + buf[len] = '\0'; + printf("%s", buf); + } +diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig +index a7e386000..d3ed5b2ae 100644 +--- a/arch/s390/Kconfig ++++ b/arch/s390/Kconfig +@@ -183,6 +183,7 @@ config S390 + select HAVE_RSEQ + select HAVE_SYSCALL_TRACEPOINTS + select HAVE_VIRT_CPU_ACCOUNTING ++ select HAVE_VIRT_CPU_ACCOUNTING_IDLE + select IOMMU_HELPER if PCI + select IOMMU_SUPPORT if PCI + select MODULES_USE_ELF_RELA +diff --git a/arch/s390/include/asm/spinlock_types.h b/arch/s390/include/asm/spinlock_types.h +index cfed272e4..8e28e8176 100644 +--- a/arch/s390/include/asm/spinlock_types.h ++++ b/arch/s390/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef __ASM_SPINLOCK_TYPES_H + #define __ASM_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + typedef struct { + int lock; + } __attribute__ ((aligned (4))) arch_spinlock_t; +diff --git a/arch/s390/include/asm/vtime.h b/arch/s390/include/asm/vtime.h +index 3622d4ebc..fac6a6798 100644 +--- a/arch/s390/include/asm/vtime.h ++++ b/arch/s390/include/asm/vtime.h +@@ -2,7 +2,6 @@ + #ifndef _S390_VTIME_H + #define _S390_VTIME_H + +-#define __ARCH_HAS_VTIME_ACCOUNT + #define __ARCH_HAS_VTIME_TASK_SWITCH + + #endif /* _S390_VTIME_H */ +diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c +index 579ec3a8c..9b3c5978b 100644 +--- a/arch/s390/kernel/vtime.c ++++ b/arch/s390/kernel/vtime.c +@@ -223,35 +223,50 @@ void vtime_flush(struct task_struct *tsk) + S390_lowcore.avg_steal_timer = avg_steal; + } + ++static u64 vtime_delta(void) ++{ ++ u64 timer = S390_lowcore.last_update_timer; ++ ++ S390_lowcore.last_update_timer = get_vtimer(); ++ ++ return timer - S390_lowcore.last_update_timer; ++} ++ + /* + * Update process times based on virtual cpu times stored by entry.S + * to the lowcore fields user_timer, system_timer & steal_clock. + */ +-void vtime_account_irq_enter(struct task_struct *tsk) ++void vtime_account_kernel(struct task_struct *tsk) + { +- u64 timer; +- +- timer = S390_lowcore.last_update_timer; +- S390_lowcore.last_update_timer = get_vtimer(); +- timer -= S390_lowcore.last_update_timer; ++ u64 delta = vtime_delta(); + +- if ((tsk->flags & PF_VCPU) && (irq_count() == 0)) +- S390_lowcore.guest_timer += timer; +- else if (hardirq_count()) +- S390_lowcore.hardirq_timer += timer; +- else if (in_serving_softirq()) +- S390_lowcore.softirq_timer += timer; ++ if (tsk->flags & PF_VCPU) ++ S390_lowcore.guest_timer += delta; + else +- S390_lowcore.system_timer += timer; ++ S390_lowcore.system_timer += delta; + +- virt_timer_forward(timer); ++ virt_timer_forward(delta); + } +-EXPORT_SYMBOL_GPL(vtime_account_irq_enter); +- +-void vtime_account_kernel(struct task_struct *tsk) +-__attribute__((alias("vtime_account_irq_enter"))); + EXPORT_SYMBOL_GPL(vtime_account_kernel); + ++void vtime_account_softirq(struct task_struct *tsk) ++{ ++ u64 delta = vtime_delta(); ++ ++ S390_lowcore.softirq_timer += delta; ++ ++ virt_timer_forward(delta); ++} ++ ++void vtime_account_hardirq(struct task_struct *tsk) ++{ ++ u64 delta = vtime_delta(); ++ ++ S390_lowcore.hardirq_timer += delta; ++ ++ virt_timer_forward(delta); ++} ++ + /* + * Sorted add to a list. List is linear searched until first bigger + * element is found. +diff --git a/arch/sh/include/asm/fixmap.h b/arch/sh/include/asm/fixmap.h +index f38adc189..b07fbc7f7 100644 +--- a/arch/sh/include/asm/fixmap.h ++++ b/arch/sh/include/asm/fixmap.h +@@ -13,9 +13,6 @@ + #include + #include + #include +-#ifdef CONFIG_HIGHMEM +-#include +-#endif + + /* + * Here we define all the compile-time 'special' virtual +@@ -53,11 +50,6 @@ enum fixed_addresses { + FIX_CMAP_BEGIN, + FIX_CMAP_END = FIX_CMAP_BEGIN + (FIX_N_COLOURS * NR_CPUS) - 1, + +-#ifdef CONFIG_HIGHMEM +- FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */ +- FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_TYPE_NR * NR_CPUS) - 1, +-#endif +- + #ifdef CONFIG_IOREMAP_FIXED + /* + * FIX_IOREMAP entries are useful for mapping physical address +diff --git a/arch/sh/include/asm/hardirq.h b/arch/sh/include/asm/hardirq.h +index edaea3559..9fe4495a8 100644 +--- a/arch/sh/include/asm/hardirq.h ++++ b/arch/sh/include/asm/hardirq.h +@@ -2,16 +2,10 @@ + #ifndef __ASM_SH_HARDIRQ_H + #define __ASM_SH_HARDIRQ_H + +-#include +-#include +- +-typedef struct { +- unsigned int __softirq_pending; +- unsigned int __nmi_count; /* arch dependent */ +-} ____cacheline_aligned irq_cpustat_t; +- +-#include /* Standard mappings for irq_cpustat_t above */ +- + extern void ack_bad_irq(unsigned int irq); ++#define ack_bad_irq ack_bad_irq ++#define ARCH_WANTS_NMI_IRQSTAT ++ ++#include + + #endif /* __ASM_SH_HARDIRQ_H */ +diff --git a/arch/sh/include/asm/kmap_types.h b/arch/sh/include/asm/kmap_types.h +deleted file mode 100644 +index b78107f92..000000000 +--- a/arch/sh/include/asm/kmap_types.h ++++ /dev/null +@@ -1,15 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0 */ +-#ifndef __SH_KMAP_TYPES_H +-#define __SH_KMAP_TYPES_H +- +-/* Dummy header just to define km_type. */ +- +-#ifdef CONFIG_DEBUG_HIGHMEM +-#define __WITH_KM_FENCE +-#endif +- +-#include +- +-#undef __WITH_KM_FENCE +- +-#endif +diff --git a/arch/sh/include/asm/spinlock_types.h b/arch/sh/include/asm/spinlock_types.h +index e82369f28..22ca9a98b 100644 +--- a/arch/sh/include/asm/spinlock_types.h ++++ b/arch/sh/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef __ASM_SH_SPINLOCK_TYPES_H + #define __ASM_SH_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + typedef struct { + volatile unsigned int lock; + } arch_spinlock_t; +diff --git a/arch/sh/kernel/irq.c b/arch/sh/kernel/irq.c +index 5717c7cbd..5db7af565 100644 +--- a/arch/sh/kernel/irq.c ++++ b/arch/sh/kernel/irq.c +@@ -44,7 +44,7 @@ int arch_show_interrupts(struct seq_file *p, int prec) + + seq_printf(p, "%*s: ", prec, "NMI"); + for_each_online_cpu(j) +- seq_printf(p, "%10u ", nmi_count(j)); ++ seq_printf(p, "%10u ", per_cpu(irq_stat.__nmi_count, j)); + seq_printf(p, " Non-maskable interrupts\n"); + + seq_printf(p, "%*s: %10u\n", prec, "ERR", atomic_read(&irq_err_count)); +@@ -148,6 +148,7 @@ void irq_ctx_exit(int cpu) + hardirq_ctx[cpu] = NULL; + } + ++#ifndef CONFIG_PREEMPT_RT + void do_softirq_own_stack(void) + { + struct thread_info *curctx; +@@ -175,6 +176,7 @@ void do_softirq_own_stack(void) + "r5", "r6", "r7", "r8", "r9", "r15", "t", "pr" + ); + } ++#endif + #else + static inline void handle_one_irq(unsigned int irq) + { +diff --git a/arch/sh/kernel/traps.c b/arch/sh/kernel/traps.c +index 9c3d32b80..f5beecdac 100644 +--- a/arch/sh/kernel/traps.c ++++ b/arch/sh/kernel/traps.c +@@ -186,7 +186,7 @@ BUILD_TRAP_HANDLER(nmi) + arch_ftrace_nmi_enter(); + + nmi_enter(); +- nmi_count(cpu)++; ++ this_cpu_inc(irq_stat.__nmi_count); + + switch (notify_die(DIE_NMI, "NMI", regs, 0, vec & 0xff, SIGINT)) { + case NOTIFY_OK: +diff --git a/arch/sh/mm/init.c b/arch/sh/mm/init.c +index 3348e0c4d..0db6919af 100644 +--- a/arch/sh/mm/init.c ++++ b/arch/sh/mm/init.c +@@ -362,9 +362,6 @@ void __init mem_init(void) + mem_init_print_info(NULL); + pr_info("virtual kernel memory layout:\n" + " fixmap : 0x%08lx - 0x%08lx (%4ld kB)\n" +-#ifdef CONFIG_HIGHMEM +- " pkmap : 0x%08lx - 0x%08lx (%4ld kB)\n" +-#endif + " vmalloc : 0x%08lx - 0x%08lx (%4ld MB)\n" + " lowmem : 0x%08lx - 0x%08lx (%4ld MB) (cached)\n" + #ifdef CONFIG_UNCACHED_MAPPING +@@ -376,11 +373,6 @@ void __init mem_init(void) + FIXADDR_START, FIXADDR_TOP, + (FIXADDR_TOP - FIXADDR_START) >> 10, + +-#ifdef CONFIG_HIGHMEM +- PKMAP_BASE, PKMAP_BASE+LAST_PKMAP*PAGE_SIZE, +- (LAST_PKMAP*PAGE_SIZE) >> 10, +-#endif +- + (unsigned long)VMALLOC_START, VMALLOC_END, + (VMALLOC_END - VMALLOC_START) >> 20, + +diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig +index 530b7ec5d..a38d00d8b 100644 +--- a/arch/sparc/Kconfig ++++ b/arch/sparc/Kconfig +@@ -139,6 +139,7 @@ config MMU + config HIGHMEM + bool + default y if SPARC32 ++ select KMAP_LOCAL + + config ZONE_DMA + bool +diff --git a/arch/sparc/include/asm/highmem.h b/arch/sparc/include/asm/highmem.h +index 6c35f0d27..875116209 100644 +--- a/arch/sparc/include/asm/highmem.h ++++ b/arch/sparc/include/asm/highmem.h +@@ -24,7 +24,6 @@ + #include + #include + #include +-#include + #include + + /* declarations for highmem.c */ +@@ -33,8 +32,6 @@ extern unsigned long highstart_pfn, highend_pfn; + #define kmap_prot __pgprot(SRMMU_ET_PTE | SRMMU_PRIV | SRMMU_CACHE) + extern pte_t *pkmap_page_table; + +-void kmap_init(void) __init; +- + /* + * Right now we initialize only a single pte table. It can be extended + * easily, subsequent pte tables have to be allocated in one physical +@@ -53,6 +50,11 @@ void kmap_init(void) __init; + + #define flush_cache_kmaps() flush_cache_all() + ++/* FIXME: Use __flush_tlb_one(vaddr) instead of flush_cache_all() -- Anton */ ++#define arch_kmap_local_post_map(vaddr, pteval) flush_cache_all() ++#define arch_kmap_local_post_unmap(vaddr) flush_cache_all() ++ ++ + #endif /* __KERNEL__ */ + + #endif /* _ASM_HIGHMEM_H */ +diff --git a/arch/sparc/include/asm/kmap_types.h b/arch/sparc/include/asm/kmap_types.h +deleted file mode 100644 +index 55a99b6bd..000000000 +--- a/arch/sparc/include/asm/kmap_types.h ++++ /dev/null +@@ -1,11 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0 */ +-#ifndef _ASM_KMAP_TYPES_H +-#define _ASM_KMAP_TYPES_H +- +-/* Dummy header just to define km_type. None of this +- * is actually used on sparc. -DaveM +- */ +- +-#include +- +-#endif +diff --git a/arch/sparc/include/asm/vaddrs.h b/arch/sparc/include/asm/vaddrs.h +index 84d054b07..4fec0341e 100644 +--- a/arch/sparc/include/asm/vaddrs.h ++++ b/arch/sparc/include/asm/vaddrs.h +@@ -32,13 +32,13 @@ + #define SRMMU_NOCACHE_ALCRATIO 64 /* 256 pages per 64MB of system RAM */ + + #ifndef __ASSEMBLY__ +-#include ++#include + + enum fixed_addresses { + FIX_HOLE, + #ifdef CONFIG_HIGHMEM + FIX_KMAP_BEGIN, +- FIX_KMAP_END = (KM_TYPE_NR * NR_CPUS), ++ FIX_KMAP_END = (KM_MAX_IDX * NR_CPUS), + #endif + __end_of_fixed_addresses + }; +diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c +index 3ec9f1402..eb21682ab 100644 +--- a/arch/sparc/kernel/irq_64.c ++++ b/arch/sparc/kernel/irq_64.c +@@ -854,6 +854,7 @@ void __irq_entry handler_irq(int pil, struct pt_regs *regs) + set_irq_regs(old_regs); + } + ++#ifndef CONFIG_PREEMPT_RT + void do_softirq_own_stack(void) + { + void *orig_sp, *sp = softirq_stack[smp_processor_id()]; +@@ -868,6 +869,7 @@ void do_softirq_own_stack(void) + __asm__ __volatile__("mov %0, %%sp" + : : "r" (orig_sp)); + } ++#endif + + #ifdef CONFIG_HOTPLUG_CPU + void fixup_irqs(void) +diff --git a/arch/sparc/mm/Makefile b/arch/sparc/mm/Makefile +index b078205b7..68db1f859 100644 +--- a/arch/sparc/mm/Makefile ++++ b/arch/sparc/mm/Makefile +@@ -15,6 +15,3 @@ obj-$(CONFIG_SPARC32) += leon_mm.o + + # Only used by sparc64 + obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o +- +-# Only used by sparc32 +-obj-$(CONFIG_HIGHMEM) += highmem.o +diff --git a/arch/sparc/mm/highmem.c b/arch/sparc/mm/highmem.c +deleted file mode 100644 +index 8f2a2afb0..000000000 +--- a/arch/sparc/mm/highmem.c ++++ /dev/null +@@ -1,115 +0,0 @@ +-// SPDX-License-Identifier: GPL-2.0 +-/* +- * highmem.c: virtual kernel memory mappings for high memory +- * +- * Provides kernel-static versions of atomic kmap functions originally +- * found as inlines in include/asm-sparc/highmem.h. These became +- * needed as kmap_atomic() and kunmap_atomic() started getting +- * called from within modules. +- * -- Tomas Szepe , September 2002 +- * +- * But kmap_atomic() and kunmap_atomic() cannot be inlined in +- * modules because they are loaded with btfixup-ped functions. +- */ +- +-/* +- * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap +- * gives a more generic (and caching) interface. But kmap_atomic can +- * be used in IRQ contexts, so in some (very limited) cases we need it. +- * +- * XXX This is an old text. Actually, it's good to use atomic kmaps, +- * provided you remember that they are atomic and not try to sleep +- * with a kmap taken, much like a spinlock. Non-atomic kmaps are +- * shared by CPUs, and so precious, and establishing them requires IPI. +- * Atomic kmaps are lightweight and we may have NCPUS more of them. +- */ +-#include +-#include +-#include +- +-#include +-#include +-#include +- +-static pte_t *kmap_pte; +- +-void __init kmap_init(void) +-{ +- unsigned long address = __fix_to_virt(FIX_KMAP_BEGIN); +- +- /* cache the first kmap pte */ +- kmap_pte = virt_to_kpte(address); +-} +- +-void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) +-{ +- unsigned long vaddr; +- long idx, type; +- +- type = kmap_atomic_idx_push(); +- idx = type + KM_TYPE_NR*smp_processor_id(); +- vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); +- +-/* XXX Fix - Anton */ +-#if 0 +- __flush_cache_one(vaddr); +-#else +- flush_cache_all(); +-#endif +- +-#ifdef CONFIG_DEBUG_HIGHMEM +- BUG_ON(!pte_none(*(kmap_pte-idx))); +-#endif +- set_pte(kmap_pte-idx, mk_pte(page, prot)); +-/* XXX Fix - Anton */ +-#if 0 +- __flush_tlb_one(vaddr); +-#else +- flush_tlb_all(); +-#endif +- +- return (void*) vaddr; +-} +-EXPORT_SYMBOL(kmap_atomic_high_prot); +- +-void kunmap_atomic_high(void *kvaddr) +-{ +- unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; +- int type; +- +- if (vaddr < FIXADDR_START) +- return; +- +- type = kmap_atomic_idx(); +- +-#ifdef CONFIG_DEBUG_HIGHMEM +- { +- unsigned long idx; +- +- idx = type + KM_TYPE_NR * smp_processor_id(); +- BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx)); +- +- /* XXX Fix - Anton */ +-#if 0 +- __flush_cache_one(vaddr); +-#else +- flush_cache_all(); +-#endif +- +- /* +- * force other mappings to Oops if they'll try to access +- * this pte without first remap it +- */ +- pte_clear(&init_mm, vaddr, kmap_pte-idx); +- /* XXX Fix - Anton */ +-#if 0 +- __flush_tlb_one(vaddr); +-#else +- flush_tlb_all(); +-#endif +- } +-#endif +- +- kmap_atomic_idx_pop(); +-} +-EXPORT_SYMBOL(kunmap_atomic_high); +diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c +index 0070f8b9a..a03caa5f6 100644 +--- a/arch/sparc/mm/srmmu.c ++++ b/arch/sparc/mm/srmmu.c +@@ -971,8 +971,6 @@ void __init srmmu_paging_init(void) + + sparc_context_init(num_contexts); + +- kmap_init(); +- + { + unsigned long max_zone_pfn[MAX_NR_ZONES] = { 0 }; + +diff --git a/arch/um/include/asm/fixmap.h b/arch/um/include/asm/fixmap.h +index 2c697a145..2efac5827 100644 +--- a/arch/um/include/asm/fixmap.h ++++ b/arch/um/include/asm/fixmap.h +@@ -3,7 +3,6 @@ + #define __UM_FIXMAP_H + + #include +-#include + #include + #include + #include +diff --git a/arch/um/include/asm/hardirq.h b/arch/um/include/asm/hardirq.h +index b426796d2..52e2c3626 100644 +--- a/arch/um/include/asm/hardirq.h ++++ b/arch/um/include/asm/hardirq.h +@@ -2,22 +2,7 @@ + #ifndef __ASM_UM_HARDIRQ_H + #define __ASM_UM_HARDIRQ_H + +-#include +-#include +- +-typedef struct { +- unsigned int __softirq_pending; +-} ____cacheline_aligned irq_cpustat_t; +- +-#include /* Standard mappings for irq_cpustat_t above */ +-#include +- +-#ifndef ack_bad_irq +-static inline void ack_bad_irq(unsigned int irq) +-{ +- printk(KERN_CRIT "unexpected IRQ trap at vector %02x\n", irq); +-} +-#endif ++#include + + #define __ARCH_IRQ_EXIT_IRQS_DISABLED 1 + +diff --git a/arch/um/include/asm/kmap_types.h b/arch/um/include/asm/kmap_types.h +deleted file mode 100644 +index b0bd12de1..000000000 +--- a/arch/um/include/asm/kmap_types.h ++++ /dev/null +@@ -1,13 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0 */ +-/* +- * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) +- */ +- +-#ifndef __UM_KMAP_TYPES_H +-#define __UM_KMAP_TYPES_H +- +-/* No more #include "asm/arch/kmap_types.h" ! */ +- +-#define KM_TYPE_NR 14 +- +-#endif +diff --git a/arch/um/kernel/kmsg_dump.c b/arch/um/kernel/kmsg_dump.c +index e4abac6c9..173999422 100644 +--- a/arch/um/kernel/kmsg_dump.c ++++ b/arch/um/kernel/kmsg_dump.c +@@ -1,15 +1,19 @@ + // SPDX-License-Identifier: GPL-2.0 + #include ++#include + #include + #include + #include + #include + + static void kmsg_dumper_stdout(struct kmsg_dumper *dumper, +- enum kmsg_dump_reason reason) ++ enum kmsg_dump_reason reason, ++ struct kmsg_dumper_iter *iter) + { ++ static DEFINE_SPINLOCK(lock); + static char line[1024]; + struct console *con; ++ unsigned long flags; + size_t len = 0; + + /* only dump kmsg when no console is available */ +@@ -24,11 +28,16 @@ static void kmsg_dumper_stdout(struct kmsg_dumper *dumper, + if (con) + return; + ++ if (!spin_trylock_irqsave(&lock, flags)) ++ return; ++ + printf("kmsg_dump:\n"); +- while (kmsg_dump_get_line(dumper, true, line, sizeof(line), &len)) { ++ while (kmsg_dump_get_line(iter, true, line, sizeof(line), &len)) { + line[len] = '\0'; + printf("%s", line); + } ++ ++ spin_unlock_irqrestore(&lock, flags); + } + + static struct kmsg_dumper kmsg_dumper = { +diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig +index 040fb7736..79c0da581 100644 +--- a/arch/x86/Kconfig ++++ b/arch/x86/Kconfig +@@ -16,6 +16,7 @@ config X86_32 + select CLKSRC_I8253 + select CLONE_BACKWARDS + select HAVE_DEBUG_STACKOVERFLOW ++ select KMAP_LOCAL + select MODULES_USE_ELF_REL + select OLD_SIGACTION + select GENERIC_VDSO_32 +@@ -95,6 +96,7 @@ config X86 + select ARCH_SUPPORTS_ACPI + select ARCH_SUPPORTS_ATOMIC_RMW + select ARCH_SUPPORTS_NUMA_BALANCING if X86_64 ++ select ARCH_SUPPORTS_RT + select ARCH_USE_BUILTIN_BSWAP + select ARCH_USE_QUEUED_RWLOCKS + select ARCH_USE_QUEUED_SPINLOCKS +@@ -216,6 +218,7 @@ config X86 + select HAVE_PCI + select HAVE_PERF_REGS + select HAVE_PERF_USER_STACK_DUMP ++ select HAVE_PREEMPT_LAZY + select MMU_GATHER_RCU_TABLE_FREE if PARAVIRT + select HAVE_POSIX_CPU_TIMERS_TASK_WORK + select HAVE_REGS_AND_STACK_ACCESS_API +diff --git a/arch/x86/crypto/aesni-intel_glue.c b/arch/x86/crypto/aesni-intel_glue.c +index be891fdf8..29c716ed1 100644 +--- a/arch/x86/crypto/aesni-intel_glue.c ++++ b/arch/x86/crypto/aesni-intel_glue.c +@@ -379,14 +379,14 @@ static int ecb_encrypt(struct skcipher_request *req) + + err = skcipher_walk_virt(&walk, req, true); + +- kernel_fpu_begin(); + while ((nbytes = walk.nbytes)) { ++ kernel_fpu_begin(); + aesni_ecb_enc(ctx, walk.dst.virt.addr, walk.src.virt.addr, + nbytes & AES_BLOCK_MASK); ++ kernel_fpu_end(); + nbytes &= AES_BLOCK_SIZE - 1; + err = skcipher_walk_done(&walk, nbytes); + } +- kernel_fpu_end(); + + return err; + } +@@ -401,14 +401,14 @@ static int ecb_decrypt(struct skcipher_request *req) + + err = skcipher_walk_virt(&walk, req, true); + +- kernel_fpu_begin(); + while ((nbytes = walk.nbytes)) { ++ kernel_fpu_begin(); + aesni_ecb_dec(ctx, walk.dst.virt.addr, walk.src.virt.addr, + nbytes & AES_BLOCK_MASK); ++ kernel_fpu_end(); + nbytes &= AES_BLOCK_SIZE - 1; + err = skcipher_walk_done(&walk, nbytes); + } +- kernel_fpu_end(); + + return err; + } +@@ -423,14 +423,14 @@ static int cbc_encrypt(struct skcipher_request *req) + + err = skcipher_walk_virt(&walk, req, true); + +- kernel_fpu_begin(); + while ((nbytes = walk.nbytes)) { ++ kernel_fpu_begin(); + aesni_cbc_enc(ctx, walk.dst.virt.addr, walk.src.virt.addr, + nbytes & AES_BLOCK_MASK, walk.iv); ++ kernel_fpu_end(); + nbytes &= AES_BLOCK_SIZE - 1; + err = skcipher_walk_done(&walk, nbytes); + } +- kernel_fpu_end(); + + return err; + } +@@ -445,14 +445,14 @@ static int cbc_decrypt(struct skcipher_request *req) + + err = skcipher_walk_virt(&walk, req, true); + +- kernel_fpu_begin(); + while ((nbytes = walk.nbytes)) { ++ kernel_fpu_begin(); + aesni_cbc_dec(ctx, walk.dst.virt.addr, walk.src.virt.addr, + nbytes & AES_BLOCK_MASK, walk.iv); ++ kernel_fpu_end(); + nbytes &= AES_BLOCK_SIZE - 1; + err = skcipher_walk_done(&walk, nbytes); + } +- kernel_fpu_end(); + + return err; + } +@@ -500,18 +500,20 @@ static int ctr_crypt(struct skcipher_request *req) + + err = skcipher_walk_virt(&walk, req, true); + +- kernel_fpu_begin(); + while ((nbytes = walk.nbytes) >= AES_BLOCK_SIZE) { ++ kernel_fpu_begin(); + aesni_ctr_enc_tfm(ctx, walk.dst.virt.addr, walk.src.virt.addr, + nbytes & AES_BLOCK_MASK, walk.iv); ++ kernel_fpu_end(); + nbytes &= AES_BLOCK_SIZE - 1; + err = skcipher_walk_done(&walk, nbytes); + } + if (walk.nbytes) { ++ kernel_fpu_begin(); + ctr_crypt_final(ctx, &walk); ++ kernel_fpu_end(); + err = skcipher_walk_done(&walk, 0); + } +- kernel_fpu_end(); + + return err; + } +diff --git a/arch/x86/crypto/cast5_avx_glue.c b/arch/x86/crypto/cast5_avx_glue.c +index 384ccb00f..2f8df8ef8 100644 +--- a/arch/x86/crypto/cast5_avx_glue.c ++++ b/arch/x86/crypto/cast5_avx_glue.c +@@ -46,7 +46,7 @@ static inline void cast5_fpu_end(bool fpu_enabled) + + static int ecb_crypt(struct skcipher_request *req, bool enc) + { +- bool fpu_enabled = false; ++ bool fpu_enabled; + struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); + struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm); + struct skcipher_walk walk; +@@ -61,7 +61,7 @@ static int ecb_crypt(struct skcipher_request *req, bool enc) + u8 *wsrc = walk.src.virt.addr; + u8 *wdst = walk.dst.virt.addr; + +- fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes); ++ fpu_enabled = cast5_fpu_begin(false, &walk, nbytes); + + /* Process multi-block batch */ + if (nbytes >= bsize * CAST5_PARALLEL_BLOCKS) { +@@ -90,10 +90,9 @@ static int ecb_crypt(struct skcipher_request *req, bool enc) + } while (nbytes >= bsize); + + done: ++ cast5_fpu_end(fpu_enabled); + err = skcipher_walk_done(&walk, nbytes); + } +- +- cast5_fpu_end(fpu_enabled); + return err; + } + +@@ -197,7 +196,7 @@ static int cbc_decrypt(struct skcipher_request *req) + { + struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); + struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm); +- bool fpu_enabled = false; ++ bool fpu_enabled; + struct skcipher_walk walk; + unsigned int nbytes; + int err; +@@ -205,12 +204,11 @@ static int cbc_decrypt(struct skcipher_request *req) + err = skcipher_walk_virt(&walk, req, false); + + while ((nbytes = walk.nbytes)) { +- fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes); ++ fpu_enabled = cast5_fpu_begin(false, &walk, nbytes); + nbytes = __cbc_decrypt(ctx, &walk); ++ cast5_fpu_end(fpu_enabled); + err = skcipher_walk_done(&walk, nbytes); + } +- +- cast5_fpu_end(fpu_enabled); + return err; + } + +@@ -277,7 +275,7 @@ static int ctr_crypt(struct skcipher_request *req) + { + struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); + struct cast5_ctx *ctx = crypto_skcipher_ctx(tfm); +- bool fpu_enabled = false; ++ bool fpu_enabled; + struct skcipher_walk walk; + unsigned int nbytes; + int err; +@@ -285,13 +283,12 @@ static int ctr_crypt(struct skcipher_request *req) + err = skcipher_walk_virt(&walk, req, false); + + while ((nbytes = walk.nbytes) >= CAST5_BLOCK_SIZE) { +- fpu_enabled = cast5_fpu_begin(fpu_enabled, &walk, nbytes); ++ fpu_enabled = cast5_fpu_begin(false, &walk, nbytes); + nbytes = __ctr_crypt(&walk, ctx); ++ cast5_fpu_end(fpu_enabled); + err = skcipher_walk_done(&walk, nbytes); + } + +- cast5_fpu_end(fpu_enabled); +- + if (walk.nbytes) { + ctr_crypt_final(&walk, ctx); + err = skcipher_walk_done(&walk, 0); +diff --git a/arch/x86/crypto/glue_helper.c b/arch/x86/crypto/glue_helper.c +index d3d91a0ab..6d0774721 100644 +--- a/arch/x86/crypto/glue_helper.c ++++ b/arch/x86/crypto/glue_helper.c +@@ -24,7 +24,7 @@ int glue_ecb_req_128bit(const struct common_glue_ctx *gctx, + void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); + const unsigned int bsize = 128 / 8; + struct skcipher_walk walk; +- bool fpu_enabled = false; ++ bool fpu_enabled; + unsigned int nbytes; + int err; + +@@ -37,7 +37,7 @@ int glue_ecb_req_128bit(const struct common_glue_ctx *gctx, + unsigned int i; + + fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, +- &walk, fpu_enabled, nbytes); ++ &walk, false, nbytes); + for (i = 0; i < gctx->num_funcs; i++) { + func_bytes = bsize * gctx->funcs[i].num_blocks; + +@@ -55,10 +55,9 @@ int glue_ecb_req_128bit(const struct common_glue_ctx *gctx, + if (nbytes < bsize) + break; + } ++ glue_fpu_end(fpu_enabled); + err = skcipher_walk_done(&walk, nbytes); + } +- +- glue_fpu_end(fpu_enabled); + return err; + } + EXPORT_SYMBOL_GPL(glue_ecb_req_128bit); +@@ -101,7 +100,7 @@ int glue_cbc_decrypt_req_128bit(const struct common_glue_ctx *gctx, + void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); + const unsigned int bsize = 128 / 8; + struct skcipher_walk walk; +- bool fpu_enabled = false; ++ bool fpu_enabled; + unsigned int nbytes; + int err; + +@@ -115,7 +114,7 @@ int glue_cbc_decrypt_req_128bit(const struct common_glue_ctx *gctx, + u128 last_iv; + + fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, +- &walk, fpu_enabled, nbytes); ++ &walk, false, nbytes); + /* Start of the last block. */ + src += nbytes / bsize - 1; + dst += nbytes / bsize - 1; +@@ -148,10 +147,10 @@ int glue_cbc_decrypt_req_128bit(const struct common_glue_ctx *gctx, + done: + u128_xor(dst, dst, (u128 *)walk.iv); + *(u128 *)walk.iv = last_iv; ++ glue_fpu_end(fpu_enabled); + err = skcipher_walk_done(&walk, nbytes); + } + +- glue_fpu_end(fpu_enabled); + return err; + } + EXPORT_SYMBOL_GPL(glue_cbc_decrypt_req_128bit); +@@ -162,7 +161,7 @@ int glue_ctr_req_128bit(const struct common_glue_ctx *gctx, + void *ctx = crypto_skcipher_ctx(crypto_skcipher_reqtfm(req)); + const unsigned int bsize = 128 / 8; + struct skcipher_walk walk; +- bool fpu_enabled = false; ++ bool fpu_enabled; + unsigned int nbytes; + int err; + +@@ -176,7 +175,7 @@ int glue_ctr_req_128bit(const struct common_glue_ctx *gctx, + le128 ctrblk; + + fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, +- &walk, fpu_enabled, nbytes); ++ &walk, false, nbytes); + + be128_to_le128(&ctrblk, (be128 *)walk.iv); + +@@ -202,11 +201,10 @@ int glue_ctr_req_128bit(const struct common_glue_ctx *gctx, + } + + le128_to_be128((be128 *)walk.iv, &ctrblk); ++ glue_fpu_end(fpu_enabled); + err = skcipher_walk_done(&walk, nbytes); + } + +- glue_fpu_end(fpu_enabled); +- + if (nbytes) { + le128 ctrblk; + u128 tmp; +@@ -306,8 +304,14 @@ int glue_xts_req_128bit(const struct common_glue_ctx *gctx, + tweak_fn(tweak_ctx, walk.iv, walk.iv); + + while (nbytes) { ++ fpu_enabled = glue_fpu_begin(bsize, gctx->fpu_blocks_limit, ++ &walk, fpu_enabled, ++ nbytes < bsize ? bsize : nbytes); + nbytes = __glue_xts_req_128bit(gctx, crypt_ctx, &walk); + ++ glue_fpu_end(fpu_enabled); ++ fpu_enabled = false; ++ + err = skcipher_walk_done(&walk, nbytes); + nbytes = walk.nbytes; + } +diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h +index 77217bd29..8eba66a33 100644 +--- a/arch/x86/include/asm/fixmap.h ++++ b/arch/x86/include/asm/fixmap.h +@@ -31,7 +31,7 @@ + #include + #ifdef CONFIG_X86_32 + #include +-#include ++#include + #else + #include + #endif +@@ -94,7 +94,7 @@ enum fixed_addresses { + #endif + #ifdef CONFIG_X86_32 + FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */ +- FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, ++ FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_MAX_IDX * NR_CPUS) - 1, + #ifdef CONFIG_PCI_MMCONFIG + FIX_PCIE_MCFG, + #endif +@@ -151,7 +151,6 @@ extern void reserve_top_address(unsigned long reserve); + + extern int fixmaps_set; + +-extern pte_t *kmap_pte; + extern pte_t *pkmap_page_table; + + void __native_set_fixmap(enum fixed_addresses idx, pte_t pte); +diff --git a/arch/x86/include/asm/fpu/api.h b/arch/x86/include/asm/fpu/api.h +index 8b9bfaad6..d31b08865 100644 +--- a/arch/x86/include/asm/fpu/api.h ++++ b/arch/x86/include/asm/fpu/api.h +@@ -28,6 +28,7 @@ extern void kernel_fpu_begin_mask(unsigned int kfpu_mask); + extern void kernel_fpu_end(void); + extern bool irq_fpu_usable(void); + extern void fpregs_mark_activate(void); ++extern void kernel_fpu_resched(void); + + /* Code that is unaware of kernel_fpu_begin_mask() can use this */ + static inline void kernel_fpu_begin(void) +@@ -40,17 +41,32 @@ static inline void kernel_fpu_begin(void) + * A context switch will (and softirq might) save CPU's FPU registers to + * fpu->state and set TIF_NEED_FPU_LOAD leaving CPU's FPU registers in + * a random state. ++ * ++ * local_bh_disable() protects against both preemption and soft interrupts ++ * on !RT kernels. ++ * ++ * On RT kernels local_bh_disable() is not sufficient because it only ++ * serializes soft interrupt related sections via a local lock, but stays ++ * preemptible. Disabling preemption is the right choice here as bottom ++ * half processing is always in thread context on RT kernels so it ++ * implicitly prevents bottom half processing as well. ++ * ++ * Disabling preemption also serializes against kernel_fpu_begin(). + */ + static inline void fpregs_lock(void) + { +- preempt_disable(); +- local_bh_disable(); ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) ++ local_bh_disable(); ++ else ++ preempt_disable(); + } + + static inline void fpregs_unlock(void) + { +- local_bh_enable(); +- preempt_enable(); ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) ++ local_bh_enable(); ++ else ++ preempt_enable(); + } + + #ifdef CONFIG_X86_DEBUG_FPU +diff --git a/arch/x86/include/asm/highmem.h b/arch/x86/include/asm/highmem.h +index 0f420b24e..032e02085 100644 +--- a/arch/x86/include/asm/highmem.h ++++ b/arch/x86/include/asm/highmem.h +@@ -23,7 +23,6 @@ + + #include + #include +-#include + #include + #include + #include +@@ -58,11 +57,17 @@ extern unsigned long highstart_pfn, highend_pfn; + #define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT) + #define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT)) + +-void *kmap_atomic_pfn(unsigned long pfn); +-void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot); +- + #define flush_cache_kmaps() do { } while (0) + ++#define arch_kmap_local_post_map(vaddr, pteval) \ ++ arch_flush_lazy_mmu_mode() ++ ++#define arch_kmap_local_post_unmap(vaddr) \ ++ do { \ ++ flush_tlb_one_kernel((vaddr)); \ ++ arch_flush_lazy_mmu_mode(); \ ++ } while (0) ++ + extern void add_highpages_with_active_regions(int nid, unsigned long start_pfn, + unsigned long end_pfn); + +diff --git a/arch/x86/include/asm/iomap.h b/arch/x86/include/asm/iomap.h +index bacf68c4d..e2de092fc 100644 +--- a/arch/x86/include/asm/iomap.h ++++ b/arch/x86/include/asm/iomap.h +@@ -9,19 +9,14 @@ + #include + #include + #include ++#include + #include + #include + +-void __iomem * +-iomap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot); ++void __iomem *__iomap_local_pfn_prot(unsigned long pfn, pgprot_t prot); + +-void +-iounmap_atomic(void __iomem *kvaddr); ++int iomap_create_wc(resource_size_t base, unsigned long size, pgprot_t *prot); + +-int +-iomap_create_wc(resource_size_t base, unsigned long size, pgprot_t *prot); +- +-void +-iomap_free(resource_size_t base, unsigned long size); ++void iomap_free(resource_size_t base, unsigned long size); + + #endif /* _ASM_X86_IOMAP_H */ +diff --git a/arch/x86/include/asm/kmap_types.h b/arch/x86/include/asm/kmap_types.h +deleted file mode 100644 +index 04ab8266e..000000000 +--- a/arch/x86/include/asm/kmap_types.h ++++ /dev/null +@@ -1,13 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0 */ +-#ifndef _ASM_X86_KMAP_TYPES_H +-#define _ASM_X86_KMAP_TYPES_H +- +-#if defined(CONFIG_X86_32) && defined(CONFIG_DEBUG_HIGHMEM) +-#define __WITH_KM_FENCE +-#endif +- +-#include +- +-#undef __WITH_KM_FENCE +- +-#endif /* _ASM_X86_KMAP_TYPES_H */ +diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h +index b30b56d47..9632218bf 100644 +--- a/arch/x86/include/asm/paravirt_types.h ++++ b/arch/x86/include/asm/paravirt_types.h +@@ -43,7 +43,6 @@ + #ifndef __ASSEMBLY__ + + #include +-#include + #include + #include + +diff --git a/arch/x86/include/asm/preempt.h b/arch/x86/include/asm/preempt.h +index 2380df419..a3b73de27 100644 +--- a/arch/x86/include/asm/preempt.h ++++ b/arch/x86/include/asm/preempt.h +@@ -90,21 +90,54 @@ static __always_inline void __preempt_count_sub(int val) + * a decrement which hits zero means we have no preempt_count and should + * reschedule. + */ +-static __always_inline bool __preempt_count_dec_and_test(void) ++static __always_inline bool ____preempt_count_dec_and_test(void) + { + return GEN_UNARY_RMWcc("decl", __preempt_count, e, __percpu_arg([var])); + } + ++static __always_inline bool __preempt_count_dec_and_test(void) ++{ ++ if (____preempt_count_dec_and_test()) ++ return true; ++#ifdef CONFIG_PREEMPT_LAZY ++ if (preempt_count()) ++ return false; ++ if (current_thread_info()->preempt_lazy_count) ++ return false; ++ return test_thread_flag(TIF_NEED_RESCHED_LAZY); ++#else ++ return false; ++#endif ++} ++ + /* + * Returns true when we need to resched and can (barring IRQ state). + */ + static __always_inline bool should_resched(int preempt_offset) + { ++#ifdef CONFIG_PREEMPT_LAZY ++ u32 tmp; ++ tmp = raw_cpu_read_4(__preempt_count); ++ if (tmp == preempt_offset) ++ return true; ++ ++ /* preempt count == 0 ? */ ++ tmp &= ~PREEMPT_NEED_RESCHED; ++ if (tmp != preempt_offset) ++ return false; ++ /* XXX PREEMPT_LOCK_OFFSET */ ++ if (current_thread_info()->preempt_lazy_count) ++ return false; ++ return test_thread_flag(TIF_NEED_RESCHED_LAZY); ++#else + return unlikely(raw_cpu_read_4(__preempt_count) == preempt_offset); ++#endif + } + + #ifdef CONFIG_PREEMPTION +- ++#ifdef CONFIG_PREEMPT_RT ++ extern void preempt_schedule_lock(void); ++#endif + extern asmlinkage void preempt_schedule(void); + extern asmlinkage void preempt_schedule_thunk(void); + +diff --git a/arch/x86/include/asm/signal.h b/arch/x86/include/asm/signal.h +index 6fd8410a3..f3bf2f515 100644 +--- a/arch/x86/include/asm/signal.h ++++ b/arch/x86/include/asm/signal.h +@@ -28,6 +28,19 @@ typedef struct { + #define SA_IA32_ABI 0x02000000u + #define SA_X32_ABI 0x01000000u + ++/* ++ * Because some traps use the IST stack, we must keep preemption ++ * disabled while calling do_trap(), but do_trap() may call ++ * force_sig_info() which will grab the signal spin_locks for the ++ * task, which in PREEMPT_RT are mutexes. By defining ++ * ARCH_RT_DELAYS_SIGNAL_SEND the force_sig_info() will set ++ * TIF_NOTIFY_RESUME and set up the signal to be sent on exit of the ++ * trap. ++ */ ++#if defined(CONFIG_PREEMPT_RT) ++#define ARCH_RT_DELAYS_SIGNAL_SEND ++#endif ++ + #ifndef CONFIG_COMPAT + typedef sigset_t compat_sigset_t; + #endif +diff --git a/arch/x86/include/asm/stackprotector.h b/arch/x86/include/asm/stackprotector.h +index 7fb482f0f..3df0a95c9 100644 +--- a/arch/x86/include/asm/stackprotector.h ++++ b/arch/x86/include/asm/stackprotector.h +@@ -65,7 +65,7 @@ + */ + static __always_inline void boot_init_stack_canary(void) + { +- u64 canary; ++ u64 canary = 0; + u64 tsc; + + #ifdef CONFIG_X86_64 +@@ -76,8 +76,14 @@ static __always_inline void boot_init_stack_canary(void) + * of randomness. The TSC only matters for very early init, + * there it already has some randomness on most systems. Later + * on during the bootup the random pool has true entropy too. ++ * For preempt-rt we need to weaken the randomness a bit, as ++ * we can't call into the random generator from atomic context ++ * due to locking constraints. We just leave canary ++ * uninitialized and use the TSC based randomness on top of it. + */ ++#ifndef CONFIG_PREEMPT_RT + get_random_bytes(&canary, sizeof(canary)); ++#endif + tsc = rdtsc(); + canary += tsc + (tsc << 32UL); + canary &= CANARY_MASK; +diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h +index a225c6e2c..414c90f04 100644 +--- a/arch/x86/include/asm/thread_info.h ++++ b/arch/x86/include/asm/thread_info.h +@@ -60,6 +60,8 @@ struct thread_info { + #ifdef CONFIG_SMP + u32 cpu; /* current CPU */ + #endif ++ int preempt_lazy_count; /* 0 => lazy preemptable ++ <0 => BUG */ + KABI_RESERVE(1) + KABI_RESERVE(2) + }; +@@ -67,12 +69,17 @@ struct thread_info { + #define INIT_THREAD_INFO(tsk) \ + { \ + .flags = 0, \ ++ .preempt_lazy_count = 0, \ + } + + #else /* !__ASSEMBLY__ */ + + #include + ++#define GET_THREAD_INFO(reg) \ ++ _ASM_MOV PER_CPU_VAR(cpu_current_top_of_stack),reg ; \ ++ _ASM_SUB $(THREAD_SIZE),reg ; ++ + #endif + + /* +@@ -99,6 +106,7 @@ struct thread_info { + #define TIF_NOTSC 16 /* TSC is not accessible in userland */ + #define TIF_IA32 17 /* IA32 compatibility process */ + #define TIF_SLD 18 /* Restore split lock detection on context switch */ ++#define TIF_NEED_RESCHED_LAZY 19 /* lazy rescheduling necessary */ + #define TIF_MEMDIE 20 /* is terminating due to OOM killer */ + #define TIF_POLLING_NRFLAG 21 /* idle is polling for TIF_NEED_RESCHED */ + #define TIF_IO_BITMAP 22 /* uses I/O bitmap */ +@@ -128,6 +136,7 @@ struct thread_info { + #define _TIF_NOTSC (1 << TIF_NOTSC) + #define _TIF_IA32 (1 << TIF_IA32) + #define _TIF_SLD (1 << TIF_SLD) ++#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) + #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) + #define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) + #define _TIF_FORCED_TF (1 << TIF_FORCED_TF) +@@ -160,6 +169,8 @@ struct thread_info { + + #define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW) + ++#define _TIF_NEED_RESCHED_MASK (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY) ++ + #define STACK_WARN (THREAD_SIZE/8) + + /* +diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c +index 65d11711c..180981654 100644 +--- a/arch/x86/kernel/cpu/mshyperv.c ++++ b/arch/x86/kernel/cpu/mshyperv.c +@@ -80,11 +80,12 @@ EXPORT_SYMBOL_GPL(hv_remove_vmbus_irq); + DEFINE_IDTENTRY_SYSVEC(sysvec_hyperv_stimer0) + { + struct pt_regs *old_regs = set_irq_regs(regs); ++ u64 ip = regs ? instruction_pointer(regs) : 0; + + inc_irq_stat(hyperv_stimer0_count); + if (hv_stimer0_handler) + hv_stimer0_handler(); +- add_interrupt_randomness(HYPERV_STIMER0_VECTOR, 0); ++ add_interrupt_randomness(HYPERV_STIMER0_VECTOR, 0, ip); + ack_APIC_irq(); + + set_irq_regs(old_regs); +diff --git a/arch/x86/kernel/crash_dump_32.c b/arch/x86/kernel/crash_dump_32.c +index 33ee47670..5fcac46aa 100644 +--- a/arch/x86/kernel/crash_dump_32.c ++++ b/arch/x86/kernel/crash_dump_32.c +@@ -13,8 +13,6 @@ + + #include + +-static void *kdump_buf_page; +- + static inline bool is_crashed_pfn_valid(unsigned long pfn) + { + #ifndef CONFIG_X86_PAE +@@ -41,15 +39,11 @@ static inline bool is_crashed_pfn_valid(unsigned long pfn) + * @userbuf: if set, @buf is in user address space, use copy_to_user(), + * otherwise @buf is in kernel address space, use memcpy(). + * +- * Copy a page from "oldmem". For this page, there is no pte mapped +- * in the current kernel. We stitch up a pte, similar to kmap_atomic. +- * +- * Calling copy_to_user() in atomic context is not desirable. Hence first +- * copying the data to a pre-allocated kernel page and then copying to user +- * space in non-atomic context. ++ * Copy a page from "oldmem". For this page, there might be no pte mapped ++ * in the current kernel. + */ +-ssize_t copy_oldmem_page(unsigned long pfn, char *buf, +- size_t csize, unsigned long offset, int userbuf) ++ssize_t copy_oldmem_page(unsigned long pfn, char *buf, size_t csize, ++ unsigned long offset, int userbuf) + { + void *vaddr; + +@@ -59,38 +53,16 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, + if (!is_crashed_pfn_valid(pfn)) + return -EFAULT; + +- vaddr = kmap_atomic_pfn(pfn); ++ vaddr = kmap_local_pfn(pfn); + + if (!userbuf) { +- memcpy(buf, (vaddr + offset), csize); +- kunmap_atomic(vaddr); ++ memcpy(buf, vaddr + offset, csize); + } else { +- if (!kdump_buf_page) { +- printk(KERN_WARNING "Kdump: Kdump buffer page not" +- " allocated\n"); +- kunmap_atomic(vaddr); +- return -EFAULT; +- } +- copy_page(kdump_buf_page, vaddr); +- kunmap_atomic(vaddr); +- if (copy_to_user(buf, (kdump_buf_page + offset), csize)) +- return -EFAULT; ++ if (copy_to_user(buf, vaddr + offset, csize)) ++ csize = -EFAULT; + } + +- return csize; +-} ++ kunmap_local(vaddr); + +-static int __init kdump_buf_page_init(void) +-{ +- int ret = 0; +- +- kdump_buf_page = kmalloc(PAGE_SIZE, GFP_KERNEL); +- if (!kdump_buf_page) { +- printk(KERN_WARNING "Kdump: Failed to allocate kdump buffer" +- " page\n"); +- ret = -ENOMEM; +- } +- +- return ret; ++ return csize; + } +-arch_initcall(kdump_buf_page_init); +diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c +index 571220ac8..d315d45b6 100644 +--- a/arch/x86/kernel/fpu/core.c ++++ b/arch/x86/kernel/fpu/core.c +@@ -159,6 +159,18 @@ void kernel_fpu_end(void) + } + EXPORT_SYMBOL_GPL(kernel_fpu_end); + ++void kernel_fpu_resched(void) ++{ ++ WARN_ON_FPU(!this_cpu_read(in_kernel_fpu)); ++ ++ if (should_resched(PREEMPT_OFFSET)) { ++ kernel_fpu_end(); ++ cond_resched(); ++ kernel_fpu_begin(); ++ } ++} ++EXPORT_SYMBOL_GPL(kernel_fpu_resched); ++ + /* + * Save the FPU state (mark it for reload if necessary): + * +diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c +index 0b79efc87..93c6b88b3 100644 +--- a/arch/x86/kernel/irq_32.c ++++ b/arch/x86/kernel/irq_32.c +@@ -131,6 +131,7 @@ int irq_init_percpu_irqstack(unsigned int cpu) + return 0; + } + ++#ifndef CONFIG_PREEMPT_RT + void do_softirq_own_stack(void) + { + struct irq_stack *irqstk; +@@ -147,6 +148,7 @@ void do_softirq_own_stack(void) + + call_on_stack(__do_softirq, isp); + } ++#endif + + void __handle_irq(struct irq_desc *desc, struct pt_regs *regs) + { +diff --git a/arch/x86/kernel/irq_64.c b/arch/x86/kernel/irq_64.c +index 440eed558..7cfc4e6b7 100644 +--- a/arch/x86/kernel/irq_64.c ++++ b/arch/x86/kernel/irq_64.c +@@ -72,7 +72,9 @@ int irq_init_percpu_irqstack(unsigned int cpu) + return map_irq_stack(cpu); + } + ++#ifndef CONFIG_PREEMPT_RT + void do_softirq_own_stack(void) + { + run_on_irqstack_cond(__do_softirq, NULL); + } ++#endif +diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c +index 556c52407..f4737e213 100644 +--- a/arch/x86/kvm/x86.c ++++ b/arch/x86/kvm/x86.c +@@ -8035,6 +8035,14 @@ int kvm_arch_init(void *opaque) + goto out; + } + ++#ifdef CONFIG_PREEMPT_RT ++ if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC)) { ++ pr_err("RT requires X86_FEATURE_CONSTANT_TSC\n"); ++ r = -EOPNOTSUPP; ++ goto out; ++ } ++#endif ++ + r = -ENOMEM; + x86_fpu_cache = kmem_cache_create("x86_fpu", sizeof(struct fpu), + __alignof__(struct fpu), SLAB_ACCOUNT, +diff --git a/arch/x86/mm/highmem_32.c b/arch/x86/mm/highmem_32.c +index 075fe5131..2c54b76d8 100644 +--- a/arch/x86/mm/highmem_32.c ++++ b/arch/x86/mm/highmem_32.c +@@ -4,65 +4,6 @@ + #include /* for totalram_pages */ + #include + +-void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) +-{ +- unsigned long vaddr; +- int idx, type; +- +- type = kmap_atomic_idx_push(); +- idx = type + KM_TYPE_NR*smp_processor_id(); +- vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); +- BUG_ON(!pte_none(*(kmap_pte-idx))); +- set_pte(kmap_pte-idx, mk_pte(page, prot)); +- arch_flush_lazy_mmu_mode(); +- +- return (void *)vaddr; +-} +-EXPORT_SYMBOL(kmap_atomic_high_prot); +- +-/* +- * This is the same as kmap_atomic() but can map memory that doesn't +- * have a struct page associated with it. +- */ +-void *kmap_atomic_pfn(unsigned long pfn) +-{ +- return kmap_atomic_prot_pfn(pfn, kmap_prot); +-} +-EXPORT_SYMBOL_GPL(kmap_atomic_pfn); +- +-void kunmap_atomic_high(void *kvaddr) +-{ +- unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; +- +- if (vaddr >= __fix_to_virt(FIX_KMAP_END) && +- vaddr <= __fix_to_virt(FIX_KMAP_BEGIN)) { +- int idx, type; +- +- type = kmap_atomic_idx(); +- idx = type + KM_TYPE_NR * smp_processor_id(); +- +-#ifdef CONFIG_DEBUG_HIGHMEM +- WARN_ON_ONCE(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx)); +-#endif +- /* +- * Force other mappings to Oops if they'll try to access this +- * pte without first remap it. Keeping stale mappings around +- * is a bad idea also, in case the page changes cacheability +- * attributes or becomes a protected page in a hypervisor. +- */ +- kpte_clear_flush(kmap_pte-idx, vaddr); +- kmap_atomic_idx_pop(); +- arch_flush_lazy_mmu_mode(); +- } +-#ifdef CONFIG_DEBUG_HIGHMEM +- else { +- BUG_ON(vaddr < PAGE_OFFSET); +- BUG_ON(vaddr >= (unsigned long)high_memory); +- } +-#endif +-} +-EXPORT_SYMBOL(kunmap_atomic_high); +- + void __init set_highmem_pages_init(void) + { + struct zone *zone; +diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c +index 7c055259d..da31c2635 100644 +--- a/arch/x86/mm/init_32.c ++++ b/arch/x86/mm/init_32.c +@@ -394,19 +394,6 @@ kernel_physical_mapping_init(unsigned long start, + return last_map_addr; + } + +-pte_t *kmap_pte; +- +-static void __init kmap_init(void) +-{ +- unsigned long kmap_vstart; +- +- /* +- * Cache the first kmap pte: +- */ +- kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN); +- kmap_pte = virt_to_kpte(kmap_vstart); +-} +- + #ifdef CONFIG_HIGHMEM + static void __init permanent_kmaps_init(pgd_t *pgd_base) + { +@@ -712,8 +699,6 @@ void __init paging_init(void) + + __flush_tlb_all(); + +- kmap_init(); +- + /* + * NOTE: at this point the bootmem allocator is fully available. + */ +diff --git a/arch/x86/mm/iomap_32.c b/arch/x86/mm/iomap_32.c +index f60398aeb..9aaa756dd 100644 +--- a/arch/x86/mm/iomap_32.c ++++ b/arch/x86/mm/iomap_32.c +@@ -44,28 +44,7 @@ void iomap_free(resource_size_t base, unsigned long size) + } + EXPORT_SYMBOL_GPL(iomap_free); + +-void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot) +-{ +- unsigned long vaddr; +- int idx, type; +- +- preempt_disable(); +- pagefault_disable(); +- +- type = kmap_atomic_idx_push(); +- idx = type + KM_TYPE_NR * smp_processor_id(); +- vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); +- set_pte(kmap_pte - idx, pfn_pte(pfn, prot)); +- arch_flush_lazy_mmu_mode(); +- +- return (void *)vaddr; +-} +- +-/* +- * Map 'pfn' using protections 'prot' +- */ +-void __iomem * +-iomap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot) ++void __iomem *__iomap_local_pfn_prot(unsigned long pfn, pgprot_t prot) + { + /* + * For non-PAT systems, translate non-WB request to UC- just in +@@ -81,36 +60,6 @@ iomap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot) + /* Filter out unsupported __PAGE_KERNEL* bits: */ + pgprot_val(prot) &= __default_kernel_pte_mask; + +- return (void __force __iomem *) kmap_atomic_prot_pfn(pfn, prot); +-} +-EXPORT_SYMBOL_GPL(iomap_atomic_prot_pfn); +- +-void +-iounmap_atomic(void __iomem *kvaddr) +-{ +- unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; +- +- if (vaddr >= __fix_to_virt(FIX_KMAP_END) && +- vaddr <= __fix_to_virt(FIX_KMAP_BEGIN)) { +- int idx, type; +- +- type = kmap_atomic_idx(); +- idx = type + KM_TYPE_NR * smp_processor_id(); +- +-#ifdef CONFIG_DEBUG_HIGHMEM +- WARN_ON_ONCE(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx)); +-#endif +- /* +- * Force other mappings to Oops if they'll try to access this +- * pte without first remap it. Keeping stale mappings around +- * is a bad idea also, in case the page changes cacheability +- * attributes or becomes a protected page in a hypervisor. +- */ +- kpte_clear_flush(kmap_pte-idx, vaddr); +- kmap_atomic_idx_pop(); +- } +- +- pagefault_enable(); +- preempt_enable(); ++ return (void __force __iomem *)__kmap_local_pfn_prot(pfn, prot); + } +-EXPORT_SYMBOL_GPL(iounmap_atomic); ++EXPORT_SYMBOL_GPL(__iomap_local_pfn_prot); +diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig +index 87e08ad38..03cbf6b53 100644 +--- a/arch/xtensa/Kconfig ++++ b/arch/xtensa/Kconfig +@@ -666,6 +666,7 @@ endchoice + config HIGHMEM + bool "High Memory Support" + depends on MMU ++ select KMAP_LOCAL + help + Linux can use the full amount of RAM in the system by + default. However, the default MMUv2 setup only maps the +diff --git a/arch/xtensa/include/asm/fixmap.h b/arch/xtensa/include/asm/fixmap.h +index a06ffb0c6..92049b61c 100644 +--- a/arch/xtensa/include/asm/fixmap.h ++++ b/arch/xtensa/include/asm/fixmap.h +@@ -16,7 +16,7 @@ + #ifdef CONFIG_HIGHMEM + #include + #include +-#include ++#include + #endif + + /* +@@ -39,7 +39,7 @@ enum fixed_addresses { + /* reserved pte's for temporary kernel mappings */ + FIX_KMAP_BEGIN, + FIX_KMAP_END = FIX_KMAP_BEGIN + +- (KM_TYPE_NR * NR_CPUS * DCACHE_N_COLORS) - 1, ++ (KM_MAX_IDX * NR_CPUS * DCACHE_N_COLORS) - 1, + #endif + __end_of_fixed_addresses + }; +diff --git a/arch/xtensa/include/asm/highmem.h b/arch/xtensa/include/asm/highmem.h +index eac503215..0fc3b1ceb 100644 +--- a/arch/xtensa/include/asm/highmem.h ++++ b/arch/xtensa/include/asm/highmem.h +@@ -16,9 +16,8 @@ + #include + #include + #include +-#include + +-#define PKMAP_BASE ((FIXADDR_START - \ ++#define PKMAP_BASE ((FIXADDR_START - \ + (LAST_PKMAP + 1) * PAGE_SIZE) & PMD_MASK) + #define LAST_PKMAP (PTRS_PER_PTE * DCACHE_N_COLORS) + #define LAST_PKMAP_MASK (LAST_PKMAP - 1) +@@ -68,6 +67,15 @@ static inline void flush_cache_kmaps(void) + flush_cache_all(); + } + ++enum fixed_addresses kmap_local_map_idx(int type, unsigned long pfn); ++#define arch_kmap_local_map_idx kmap_local_map_idx ++ ++enum fixed_addresses kmap_local_unmap_idx(int type, unsigned long addr); ++#define arch_kmap_local_unmap_idx kmap_local_unmap_idx ++ ++#define arch_kmap_local_post_unmap(vaddr) \ ++ local_flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE) ++ + void kmap_init(void); + + #endif +diff --git a/arch/xtensa/include/asm/spinlock_types.h b/arch/xtensa/include/asm/spinlock_types.h +index 64c938925..dc846323b 100644 +--- a/arch/xtensa/include/asm/spinlock_types.h ++++ b/arch/xtensa/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef __ASM_SPINLOCK_TYPES_H + #define __ASM_SPINLOCK_TYPES_H + +-#if !defined(__LINUX_SPINLOCK_TYPES_H) && !defined(__ASM_SPINLOCK_H) +-# error "please don't include this file directly" +-#endif +- + #include + #include + +diff --git a/arch/xtensa/mm/highmem.c b/arch/xtensa/mm/highmem.c +index 673196fe8..0735ca5e8 100644 +--- a/arch/xtensa/mm/highmem.c ++++ b/arch/xtensa/mm/highmem.c +@@ -12,8 +12,6 @@ + #include + #include + +-static pte_t *kmap_pte; +- + #if DCACHE_WAY_SIZE > PAGE_SIZE + unsigned int last_pkmap_nr_arr[DCACHE_N_COLORS]; + wait_queue_head_t pkmap_map_wait_arr[DCACHE_N_COLORS]; +@@ -33,59 +31,25 @@ static inline void kmap_waitqueues_init(void) + + static inline enum fixed_addresses kmap_idx(int type, unsigned long color) + { +- return (type + KM_TYPE_NR * smp_processor_id()) * DCACHE_N_COLORS + ++ return (type + KM_MAX_IDX * smp_processor_id()) * DCACHE_N_COLORS + + color; + } + +-void *kmap_atomic_high_prot(struct page *page, pgprot_t prot) ++enum fixed_addresses kmap_local_map_idx(int type, unsigned long pfn) + { +- enum fixed_addresses idx; +- unsigned long vaddr; +- +- idx = kmap_idx(kmap_atomic_idx_push(), +- DCACHE_ALIAS(page_to_phys(page))); +- vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); +-#ifdef CONFIG_DEBUG_HIGHMEM +- BUG_ON(!pte_none(*(kmap_pte + idx))); +-#endif +- set_pte(kmap_pte + idx, mk_pte(page, prot)); +- +- return (void *)vaddr; ++ return kmap_idx(type, DCACHE_ALIAS(pfn << PAGE_SHIFT)); + } +-EXPORT_SYMBOL(kmap_atomic_high_prot); + +-void kunmap_atomic_high(void *kvaddr) ++enum fixed_addresses kmap_local_unmap_idx(int type, unsigned long addr) + { +- if (kvaddr >= (void *)FIXADDR_START && +- kvaddr < (void *)FIXADDR_TOP) { +- int idx = kmap_idx(kmap_atomic_idx(), +- DCACHE_ALIAS((unsigned long)kvaddr)); +- +- /* +- * Force other mappings to Oops if they'll try to access this +- * pte without first remap it. Keeping stale mappings around +- * is a bad idea also, in case the page changes cacheability +- * attributes or becomes a protected page in a hypervisor. +- */ +- pte_clear(&init_mm, kvaddr, kmap_pte + idx); +- local_flush_tlb_kernel_range((unsigned long)kvaddr, +- (unsigned long)kvaddr + PAGE_SIZE); +- +- kmap_atomic_idx_pop(); +- } ++ return kmap_idx(type, DCACHE_ALIAS(addr)); + } +-EXPORT_SYMBOL(kunmap_atomic_high); + + void __init kmap_init(void) + { +- unsigned long kmap_vstart; +- + /* Check if this memory layout is broken because PKMAP overlaps + * page table. + */ + BUILD_BUG_ON(PKMAP_BASE < TLBTEMP_BASE_1 + TLBTEMP_SIZE); +- /* cache the first kmap pte */ +- kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN); +- kmap_pte = virt_to_kpte(kmap_vstart); + kmap_waitqueues_init(); + } +diff --git a/block/blk-mq.c b/block/blk-mq.c +index cedc35521..07db0e90c 100644 +--- a/block/blk-mq.c ++++ b/block/blk-mq.c +@@ -44,7 +44,7 @@ + bool mq_unfair_dtag = true; + module_param_named(unfair_dtag, mq_unfair_dtag, bool, 0444); + +-static DEFINE_PER_CPU(struct list_head, blk_cpu_done); ++static DEFINE_PER_CPU(struct llist_head, blk_cpu_done); + + static void blk_mq_poll_stats_start(struct request_queue *q); + static void blk_mq_poll_stats_fn(struct blk_stat_callback *cb); +@@ -590,80 +590,29 @@ void blk_mq_end_request(struct request *rq, blk_status_t error) + } + EXPORT_SYMBOL(blk_mq_end_request); + +-/* +- * Softirq action handler - move entries to local list and loop over them +- * while passing them to the queue registered handler. +- */ +-static __latent_entropy void blk_done_softirq(struct softirq_action *h) ++static void blk_complete_reqs(struct llist_head *list) + { +- struct list_head *cpu_list, local_list; +- +- local_irq_disable(); +- cpu_list = this_cpu_ptr(&blk_cpu_done); +- list_replace_init(cpu_list, &local_list); +- local_irq_enable(); +- +- while (!list_empty(&local_list)) { +- struct request *rq; ++ struct llist_node *entry = llist_reverse_order(llist_del_all(list)); ++ struct request *rq, *next; + +- rq = list_entry(local_list.next, struct request, ipi_list); +- list_del_init(&rq->ipi_list); ++ llist_for_each_entry_safe(rq, next, entry, ipi_list) + rq->q->mq_ops->complete(rq); +- } + } + +-static void blk_mq_trigger_softirq(struct request *rq) ++static __latent_entropy void blk_done_softirq(struct softirq_action *h) + { +- struct list_head *list; +- unsigned long flags; +- +- local_irq_save(flags); +- list = this_cpu_ptr(&blk_cpu_done); +- list_add_tail(&rq->ipi_list, list); +- +- /* +- * If the list only contains our just added request, signal a raise of +- * the softirq. If there are already entries there, someone already +- * raised the irq but it hasn't run yet. +- */ +- if (list->next == &rq->ipi_list) +- raise_softirq_irqoff(BLOCK_SOFTIRQ); +- local_irq_restore(flags); ++ blk_complete_reqs(this_cpu_ptr(&blk_cpu_done)); + } + + static int blk_softirq_cpu_dead(unsigned int cpu) + { +- /* +- * If a CPU goes away, splice its entries to the current CPU +- * and trigger a run of the softirq +- */ +- local_irq_disable(); +- list_splice_init(&per_cpu(blk_cpu_done, cpu), +- this_cpu_ptr(&blk_cpu_done)); +- raise_softirq_irqoff(BLOCK_SOFTIRQ); +- local_irq_enable(); +- ++ blk_complete_reqs(&per_cpu(blk_cpu_done, cpu)); + return 0; + } + +- + static void __blk_mq_complete_request_remote(void *data) + { +- struct request *rq = data; +- +- /* +- * For most of single queue controllers, there is only one irq vector +- * for handling I/O completion, and the only irq's affinity is set +- * to all possible CPUs. On most of ARCHs, this affinity means the irq +- * is handled on one specific CPU. +- * +- * So complete I/O requests in softirq context in case of single queue +- * devices to avoid degrading I/O performance due to irqsoff latency. +- */ +- if (rq->q->nr_hw_queues == 1) +- blk_mq_trigger_softirq(rq); +- else +- rq->q->mq_ops->complete(rq); ++ __raise_softirq_irqoff(BLOCK_SOFTIRQ); + } + + static inline bool blk_mq_complete_need_ipi(struct request *rq) +@@ -673,6 +622,14 @@ static inline bool blk_mq_complete_need_ipi(struct request *rq) + if (!IS_ENABLED(CONFIG_SMP) || + !test_bit(QUEUE_FLAG_SAME_COMP, &rq->q->queue_flags)) + return false; ++ /* ++ * With force threaded interrupts enabled, raising softirq from an SMP ++ * function call will always result in waking the ksoftirqd thread. ++ * This is probably worse than completing the request on a different ++ * cache domain. ++ */ ++ if (force_irqthreads) ++ return false; + + /* same CPU or cache domain? Complete locally */ + if (cpu == rq->mq_ctx->cpu || +@@ -684,6 +641,31 @@ static inline bool blk_mq_complete_need_ipi(struct request *rq) + return cpu_online(rq->mq_ctx->cpu); + } + ++static void blk_mq_complete_send_ipi(struct request *rq) ++{ ++ struct llist_head *list; ++ unsigned int cpu; ++ ++ cpu = rq->mq_ctx->cpu; ++ list = &per_cpu(blk_cpu_done, cpu); ++ if (llist_add(&rq->ipi_list, list)) { ++ rq->csd.func = __blk_mq_complete_request_remote; ++ rq->csd.info = rq; ++ smp_call_function_single_async(cpu, &rq->csd); ++ } ++} ++ ++static void blk_mq_raise_softirq(struct request *rq) ++{ ++ struct llist_head *list; ++ ++ preempt_disable(); ++ list = this_cpu_ptr(&blk_cpu_done); ++ if (llist_add(&rq->ipi_list, list)) ++ raise_softirq(BLOCK_SOFTIRQ); ++ preempt_enable(); ++} ++ + bool blk_mq_complete_request_remote(struct request *rq) + { + WRITE_ONCE(rq->state, MQ_RQ_COMPLETE); +@@ -696,15 +678,15 @@ bool blk_mq_complete_request_remote(struct request *rq) + return false; + + if (blk_mq_complete_need_ipi(rq)) { +- INIT_CSD(&rq->csd, __blk_mq_complete_request_remote, rq); +- smp_call_function_single_async(rq->mq_ctx->cpu, &rq->csd); +- } else { +- if (rq->q->nr_hw_queues > 1) +- return false; +- blk_mq_trigger_softirq(rq); ++ blk_mq_complete_send_ipi(rq); ++ return true; + } + +- return true; ++ if (rq->q->nr_hw_queues == 1) { ++ blk_mq_raise_softirq(rq); ++ return true; ++ } ++ return false; + } + EXPORT_SYMBOL_GPL(blk_mq_complete_request_remote); + +@@ -1617,14 +1599,14 @@ static void __blk_mq_delay_run_hw_queue(struct blk_mq_hw_ctx *hctx, bool async, + return; + + if (!async && !(hctx->flags & BLK_MQ_F_BLOCKING)) { +- int cpu = get_cpu(); ++ int cpu = get_cpu_light(); + if (cpumask_test_cpu(cpu, hctx->cpumask)) { + __blk_mq_run_hw_queue(hctx); +- put_cpu(); ++ put_cpu_light(); + return; + } + +- put_cpu(); ++ put_cpu_light(); + } + + kblockd_mod_delayed_work_on(blk_mq_hctx_next_cpu(hctx), &hctx->run_work, +@@ -4096,7 +4078,7 @@ static int __init blk_mq_init(void) + int i; + + for_each_possible_cpu(i) +- INIT_LIST_HEAD(&per_cpu(blk_cpu_done, i)); ++ init_llist_head(&per_cpu(blk_cpu_done, i)); + open_softirq(BLOCK_SOFTIRQ, blk_done_softirq); + + cpuhp_setup_state_nocalls(CPUHP_BLOCK_SOFTIRQ_DEAD, +diff --git a/crypto/cryptd.c b/crypto/cryptd.c +index a1bea0f4b..5f8ca8c1f 100644 +--- a/crypto/cryptd.c ++++ b/crypto/cryptd.c +@@ -36,6 +36,7 @@ static struct workqueue_struct *cryptd_wq; + struct cryptd_cpu_queue { + struct crypto_queue queue; + struct work_struct work; ++ spinlock_t qlock; + }; + + struct cryptd_queue { +@@ -105,6 +106,7 @@ static int cryptd_init_queue(struct cryptd_queue *queue, + cpu_queue = per_cpu_ptr(queue->cpu_queue, cpu); + crypto_init_queue(&cpu_queue->queue, max_cpu_qlen); + INIT_WORK(&cpu_queue->work, cryptd_queue_worker); ++ spin_lock_init(&cpu_queue->qlock); + } + pr_info("cryptd: max_cpu_qlen set to %d\n", max_cpu_qlen); + return 0; +@@ -129,8 +131,10 @@ static int cryptd_enqueue_request(struct cryptd_queue *queue, + struct cryptd_cpu_queue *cpu_queue; + refcount_t *refcnt; + +- cpu = get_cpu(); +- cpu_queue = this_cpu_ptr(queue->cpu_queue); ++ cpu_queue = raw_cpu_ptr(queue->cpu_queue); ++ spin_lock_bh(&cpu_queue->qlock); ++ cpu = smp_processor_id(); ++ + err = crypto_enqueue_request(&cpu_queue->queue, request); + + refcnt = crypto_tfm_ctx(request->tfm); +@@ -146,7 +150,7 @@ static int cryptd_enqueue_request(struct cryptd_queue *queue, + refcount_inc(refcnt); + + out_put_cpu: +- put_cpu(); ++ spin_unlock_bh(&cpu_queue->qlock); + + return err; + } +@@ -162,16 +166,11 @@ static void cryptd_queue_worker(struct work_struct *work) + cpu_queue = container_of(work, struct cryptd_cpu_queue, work); + /* + * Only handle one request at a time to avoid hogging crypto workqueue. +- * preempt_disable/enable is used to prevent being preempted by +- * cryptd_enqueue_request(). local_bh_disable/enable is used to prevent +- * cryptd_enqueue_request() being accessed from software interrupts. + */ +- local_bh_disable(); +- preempt_disable(); ++ spin_lock_bh(&cpu_queue->qlock); + backlog = crypto_get_backlog(&cpu_queue->queue); + req = crypto_dequeue_request(&cpu_queue->queue); +- preempt_enable(); +- local_bh_enable(); ++ spin_unlock_bh(&cpu_queue->qlock); + + if (!req) + return; +diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c +index b574cce98..422753d52 100644 +--- a/drivers/atm/eni.c ++++ b/drivers/atm/eni.c +@@ -2054,7 +2054,7 @@ static int eni_send(struct atm_vcc *vcc,struct sk_buff *skb) + } + submitted++; + ATM_SKB(skb)->vcc = vcc; +- tasklet_disable(&ENI_DEV(vcc->dev)->task); ++ tasklet_disable_in_atomic(&ENI_DEV(vcc->dev)->task); + res = do_tx(skb); + tasklet_enable(&ENI_DEV(vcc->dev)->task); + if (res == enq_ok) return 0; +diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c +index 0636df6b6..1a7523cef 100644 +--- a/drivers/block/zram/zram_drv.c ++++ b/drivers/block/zram/zram_drv.c +@@ -59,6 +59,40 @@ static void zram_free_page(struct zram *zram, size_t index); + static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec, + u32 index, int offset, struct bio *bio); + ++#ifdef CONFIG_PREEMPT_RT ++static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages) ++{ ++ size_t index; ++ ++ for (index = 0; index < num_pages; index++) ++ spin_lock_init(&zram->table[index].lock); ++} ++ ++static int zram_slot_trylock(struct zram *zram, u32 index) ++{ ++ int ret; ++ ++ ret = spin_trylock(&zram->table[index].lock); ++ if (ret) ++ __set_bit(ZRAM_LOCK, &zram->table[index].flags); ++ return ret; ++} ++ ++static void zram_slot_lock(struct zram *zram, u32 index) ++{ ++ spin_lock(&zram->table[index].lock); ++ __set_bit(ZRAM_LOCK, &zram->table[index].flags); ++} ++ ++static void zram_slot_unlock(struct zram *zram, u32 index) ++{ ++ __clear_bit(ZRAM_LOCK, &zram->table[index].flags); ++ spin_unlock(&zram->table[index].lock); ++} ++ ++#else ++ ++static void zram_meta_init_table_locks(struct zram *zram, size_t num_pages) { } + + static int zram_slot_trylock(struct zram *zram, u32 index) + { +@@ -74,6 +108,7 @@ static void zram_slot_unlock(struct zram *zram, u32 index) + { + bit_spin_unlock(ZRAM_LOCK, &zram->table[index].flags); + } ++#endif + + static inline bool init_done(struct zram *zram) + { +@@ -1165,6 +1200,7 @@ static bool zram_meta_alloc(struct zram *zram, u64 disksize) + + if (!huge_class_size) + huge_class_size = zs_huge_class_size(zram->mem_pool); ++ zram_meta_init_table_locks(zram, num_pages); + return true; + } + +diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h +index f2fd46daa..7e4dd447e 100644 +--- a/drivers/block/zram/zram_drv.h ++++ b/drivers/block/zram/zram_drv.h +@@ -63,6 +63,7 @@ struct zram_table_entry { + unsigned long element; + }; + unsigned long flags; ++ spinlock_t lock; + #ifdef CONFIG_ZRAM_MEMORY_TRACKING + ktime_t ac_time; + #endif +diff --git a/drivers/char/random.c b/drivers/char/random.c +index cb96d3a07..1a930cfa1 100644 +--- a/drivers/char/random.c ++++ b/drivers/char/random.c +@@ -1270,28 +1270,27 @@ static __u32 get_reg(struct fast_pool *f, struct pt_regs *regs) + return *ptr; + } + +-void add_interrupt_randomness(int irq, int irq_flags) ++void add_interrupt_randomness(int irq, int irq_flags, __u64 ip) + { + struct entropy_store *r; + struct fast_pool *fast_pool = this_cpu_ptr(&irq_randomness); +- struct pt_regs *regs = get_irq_regs(); + unsigned long now = jiffies; + cycles_t cycles = random_get_entropy(); + __u32 c_high, j_high; +- __u64 ip; + unsigned long seed; + int credit = 0; + + if (cycles == 0) +- cycles = get_reg(fast_pool, regs); ++ cycles = get_reg(fast_pool, NULL); + c_high = (sizeof(cycles) > 4) ? cycles >> 32 : 0; + j_high = (sizeof(now) > 4) ? now >> 32 : 0; + fast_pool->pool[0] ^= cycles ^ j_high ^ irq; + fast_pool->pool[1] ^= now ^ c_high; +- ip = regs ? instruction_pointer(regs) : _RET_IP_; ++ if (!ip) ++ ip = _RET_IP_; + fast_pool->pool[2] ^= ip; + fast_pool->pool[3] ^= (sizeof(ip) > 4) ? ip >> 32 : +- get_reg(fast_pool, regs); ++ get_reg(fast_pool, NULL); + + fast_mix(fast_pool); + add_interrupt_bench(cycles); +diff --git a/drivers/char/tpm/tpm-dev-common.c b/drivers/char/tpm/tpm-dev-common.c +index 1784530b8..c08cbb306 100644 +--- a/drivers/char/tpm/tpm-dev-common.c ++++ b/drivers/char/tpm/tpm-dev-common.c +@@ -20,7 +20,6 @@ + #include "tpm-dev.h" + + static struct workqueue_struct *tpm_dev_wq; +-static DEFINE_MUTEX(tpm_dev_wq_lock); + + static ssize_t tpm_dev_transmit(struct tpm_chip *chip, struct tpm_space *space, + u8 *buf, size_t bufsiz) +diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c +index 4ed6e6602..c2bd0d40b 100644 +--- a/drivers/char/tpm/tpm_tis.c ++++ b/drivers/char/tpm/tpm_tis.c +@@ -50,6 +50,31 @@ static inline struct tpm_tis_tcg_phy *to_tpm_tis_tcg_phy(struct tpm_tis_data *da + return container_of(data, struct tpm_tis_tcg_phy, priv); + } + ++#ifdef CONFIG_PREEMPT_RT ++/* ++ * Flushes previous write operations to chip so that a subsequent ++ * ioread*()s won't stall a cpu. ++ */ ++static inline void tpm_tis_flush(void __iomem *iobase) ++{ ++ ioread8(iobase + TPM_ACCESS(0)); ++} ++#else ++#define tpm_tis_flush(iobase) do { } while (0) ++#endif ++ ++static inline void tpm_tis_iowrite8(u8 b, void __iomem *iobase, u32 addr) ++{ ++ iowrite8(b, iobase + addr); ++ tpm_tis_flush(iobase); ++} ++ ++static inline void tpm_tis_iowrite32(u32 b, void __iomem *iobase, u32 addr) ++{ ++ iowrite32(b, iobase + addr); ++ tpm_tis_flush(iobase); ++} ++ + static int interrupts = -1; + module_param(interrupts, int, 0444); + MODULE_PARM_DESC(interrupts, "Enable interrupts"); +@@ -169,7 +194,7 @@ static int tpm_tcg_write_bytes(struct tpm_tis_data *data, u32 addr, u16 len, + struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); + + while (len--) +- iowrite8(*value++, phy->iobase + addr); ++ tpm_tis_iowrite8(*value++, phy->iobase, addr); + + return 0; + } +@@ -196,7 +221,7 @@ static int tpm_tcg_write32(struct tpm_tis_data *data, u32 addr, u32 value) + { + struct tpm_tis_tcg_phy *phy = to_tpm_tis_tcg_phy(data); + +- iowrite32(value, phy->iobase + addr); ++ tpm_tis_iowrite32(value, phy->iobase, addr); + + return 0; + } +diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c +index 9811c4095..17c9d8251 100644 +--- a/drivers/firewire/ohci.c ++++ b/drivers/firewire/ohci.c +@@ -2545,7 +2545,7 @@ static int ohci_cancel_packet(struct fw_card *card, struct fw_packet *packet) + struct driver_data *driver_data = packet->driver_data; + int ret = -ENOENT; + +- tasklet_disable(&ctx->tasklet); ++ tasklet_disable_in_atomic(&ctx->tasklet); + + if (packet->ack != 0) + goto out; +@@ -3465,7 +3465,7 @@ static int ohci_flush_iso_completions(struct fw_iso_context *base) + struct iso_context *ctx = container_of(base, struct iso_context, base); + int ret = 0; + +- tasklet_disable(&ctx->context.tasklet); ++ tasklet_disable_in_atomic(&ctx->context.tasklet); + + if (!test_and_set_bit_lock(0, &ctx->flushing_completions)) { + context_tasklet((unsigned long)&ctx->context); +diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c +index 098d87961..2a8aa5212 100644 +--- a/drivers/firmware/efi/efi.c ++++ b/drivers/firmware/efi/efi.c +@@ -66,7 +66,7 @@ struct mm_struct efi_mm = { + + struct workqueue_struct *efi_rts_wq; + +-static bool disable_runtime; ++static bool disable_runtime = IS_ENABLED(CONFIG_PREEMPT_RT); + static int __init setup_noefi(char *arg) + { + disable_runtime = true; +@@ -97,6 +97,9 @@ static int __init parse_efi_cmdline(char *str) + if (parse_option_str(str, "noruntime")) + disable_runtime = true; + ++ if (parse_option_str(str, "runtime")) ++ disable_runtime = false; ++ + if (parse_option_str(str, "nosoftreserve")) + set_bit(EFI_MEM_NO_SOFT_RESERVE, &efi.flags); + +diff --git a/drivers/gpu/drm/i915/display/intel_sprite.c b/drivers/gpu/drm/i915/display/intel_sprite.c +index 12f7128b7..a65061e3e 100644 +--- a/drivers/gpu/drm/i915/display/intel_sprite.c ++++ b/drivers/gpu/drm/i915/display/intel_sprite.c +@@ -118,7 +118,8 @@ void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state) + "PSR idle timed out 0x%x, atomic update may fail\n", + psr_status); + +- local_irq_disable(); ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) ++ local_irq_disable(); + + crtc->debug.min_vbl = min; + crtc->debug.max_vbl = max; +@@ -143,11 +144,13 @@ void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state) + break; + } + +- local_irq_enable(); ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) ++ local_irq_enable(); + + timeout = schedule_timeout(timeout); + +- local_irq_disable(); ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) ++ local_irq_disable(); + } + + finish_wait(wq, &wait); +@@ -180,7 +183,8 @@ void intel_pipe_update_start(const struct intel_crtc_state *new_crtc_state) + return; + + irq_disable: +- local_irq_disable(); ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) ++ local_irq_disable(); + } + + /** +@@ -218,7 +222,8 @@ void intel_pipe_update_end(struct intel_crtc_state *new_crtc_state) + new_crtc_state->uapi.event = NULL; + } + +- local_irq_enable(); ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) ++ local_irq_enable(); + + if (intel_vgpu_active(dev_priv)) + return; +diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c +index 0c083af5a..2abf043d3 100644 +--- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c ++++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c +@@ -1080,7 +1080,7 @@ static void reloc_cache_reset(struct reloc_cache *cache, struct i915_execbuffer + struct i915_ggtt *ggtt = cache_to_ggtt(cache); + + intel_gt_flush_ggtt_writes(ggtt->vm.gt); +- io_mapping_unmap_atomic((void __iomem *)vaddr); ++ io_mapping_unmap_local((void __iomem *)vaddr); + + if (drm_mm_node_allocated(&cache->node)) { + ggtt->vm.clear_range(&ggtt->vm, +@@ -1146,7 +1146,7 @@ static void *reloc_iomap(struct drm_i915_gem_object *obj, + + if (cache->vaddr) { + intel_gt_flush_ggtt_writes(ggtt->vm.gt); +- io_mapping_unmap_atomic((void __force __iomem *) unmask_page(cache->vaddr)); ++ io_mapping_unmap_local((void __force __iomem *) unmask_page(cache->vaddr)); + } else { + struct i915_vma *vma; + int err; +@@ -1194,8 +1194,7 @@ static void *reloc_iomap(struct drm_i915_gem_object *obj, + offset += page << PAGE_SHIFT; + } + +- vaddr = (void __force *)io_mapping_map_atomic_wc(&ggtt->iomap, +- offset); ++ vaddr = (void __force *)io_mapping_map_local_wc(&ggtt->iomap, offset); + cache->page = page; + cache->vaddr = (unsigned long)vaddr; + +diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c +index 0040b4765..3f4f85478 100644 +--- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c ++++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c +@@ -342,10 +342,9 @@ void intel_breadcrumbs_park(struct intel_breadcrumbs *b) + /* Kick the work once more to drain the signalers */ + irq_work_sync(&b->irq_work); + while (unlikely(READ_ONCE(b->irq_armed))) { +- local_irq_disable(); +- signal_irq_work(&b->irq_work); +- local_irq_enable(); ++ irq_work_queue(&b->irq_work); + cond_resched(); ++ irq_work_sync(&b->irq_work); + } + GEM_BUG_ON(!list_empty(&b->signalers)); + } +diff --git a/drivers/gpu/drm/i915/gt/intel_engine_pm.c b/drivers/gpu/drm/i915/gt/intel_engine_pm.c +index f7b2e07e2..313d8a28e 100644 +--- a/drivers/gpu/drm/i915/gt/intel_engine_pm.c ++++ b/drivers/gpu/drm/i915/gt/intel_engine_pm.c +@@ -60,9 +60,10 @@ static int __engine_unpark(struct intel_wakeref *wf) + + static inline unsigned long __timeline_mark_lock(struct intel_context *ce) + { +- unsigned long flags; ++ unsigned long flags = 0; + +- local_irq_save(flags); ++ if (!force_irqthreads) ++ local_irq_save(flags); + mutex_acquire(&ce->timeline->mutex.dep_map, 2, 0, _THIS_IP_); + + return flags; +@@ -72,7 +73,8 @@ static inline void __timeline_mark_unlock(struct intel_context *ce, + unsigned long flags) + { + mutex_release(&ce->timeline->mutex.dep_map, _THIS_IP_); +- local_irq_restore(flags); ++ if (!force_irqthreads) ++ local_irq_restore(flags); + } + + #else +diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c +index 58276694c..88944c3b1 100644 +--- a/drivers/gpu/drm/i915/i915_gem.c ++++ b/drivers/gpu/drm/i915/i915_gem.c +@@ -355,22 +355,15 @@ gtt_user_read(struct io_mapping *mapping, + char __user *user_data, int length) + { + void __iomem *vaddr; +- unsigned long unwritten; ++ bool fail = false; + + /* We can use the cpu mem copy function because this is X86. */ +- vaddr = io_mapping_map_atomic_wc(mapping, base); +- unwritten = __copy_to_user_inatomic(user_data, +- (void __force *)vaddr + offset, +- length); +- io_mapping_unmap_atomic(vaddr); +- if (unwritten) { +- vaddr = io_mapping_map_wc(mapping, base, PAGE_SIZE); +- unwritten = copy_to_user(user_data, +- (void __force *)vaddr + offset, +- length); +- io_mapping_unmap(vaddr); +- } +- return unwritten; ++ vaddr = io_mapping_map_local_wc(mapping, base); ++ if (copy_to_user(user_data, (void __force *)vaddr + offset, length)) ++ fail = true; ++ io_mapping_unmap_local(vaddr); ++ ++ return fail; + } + + static int +@@ -539,21 +532,14 @@ ggtt_write(struct io_mapping *mapping, + char __user *user_data, int length) + { + void __iomem *vaddr; +- unsigned long unwritten; ++ bool fail = false; + + /* We can use the cpu mem copy function because this is X86. */ +- vaddr = io_mapping_map_atomic_wc(mapping, base); +- unwritten = __copy_from_user_inatomic_nocache((void __force *)vaddr + offset, +- user_data, length); +- io_mapping_unmap_atomic(vaddr); +- if (unwritten) { +- vaddr = io_mapping_map_wc(mapping, base, PAGE_SIZE); +- unwritten = copy_from_user((void __force *)vaddr + offset, +- user_data, length); +- io_mapping_unmap(vaddr); +- } +- +- return unwritten; ++ vaddr = io_mapping_map_local_wc(mapping, base); ++ if (copy_from_user((void __force *)vaddr + offset, user_data, length)) ++ fail = true; ++ io_mapping_unmap_local(vaddr); ++ return fail; + } + + /** +diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c +index 759f523c6..7339a42ab 100644 +--- a/drivers/gpu/drm/i915/i915_irq.c ++++ b/drivers/gpu/drm/i915/i915_irq.c +@@ -847,6 +847,7 @@ static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc, + spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); + + /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */ ++ preempt_disable_rt(); + + /* Get optional system timestamp before query. */ + if (stime) +@@ -898,6 +899,7 @@ static bool i915_get_crtc_scanoutpos(struct drm_crtc *_crtc, + *etime = ktime_get(); + + /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */ ++ preempt_enable_rt(); + + spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); + +diff --git a/drivers/gpu/drm/i915/i915_trace.h b/drivers/gpu/drm/i915/i915_trace.h +index a4addcc64..396b65986 100644 +--- a/drivers/gpu/drm/i915/i915_trace.h ++++ b/drivers/gpu/drm/i915/i915_trace.h +@@ -2,6 +2,10 @@ + #if !defined(_I915_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ) + #define _I915_TRACE_H_ + ++#ifdef CONFIG_PREEMPT_RT ++#define NOTRACE ++#endif ++ + #include + #include + #include +@@ -778,7 +782,7 @@ DEFINE_EVENT(i915_request, i915_request_add, + TP_ARGS(rq) + ); + +-#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS) ++#if defined(CONFIG_DRM_I915_LOW_LEVEL_TRACEPOINTS) && !defined(NOTRACE) + DEFINE_EVENT(i915_request, i915_request_submit, + TP_PROTO(struct i915_request *rq), + TP_ARGS(rq) +diff --git a/drivers/gpu/drm/i915/selftests/i915_gem.c b/drivers/gpu/drm/i915/selftests/i915_gem.c +index 412e21604..432493183 100644 +--- a/drivers/gpu/drm/i915/selftests/i915_gem.c ++++ b/drivers/gpu/drm/i915/selftests/i915_gem.c +@@ -57,12 +57,12 @@ static void trash_stolen(struct drm_i915_private *i915) + + ggtt->vm.insert_page(&ggtt->vm, dma, slot, I915_CACHE_NONE, 0); + +- s = io_mapping_map_atomic_wc(&ggtt->iomap, slot); ++ s = io_mapping_map_local_wc(&ggtt->iomap, slot); + for (x = 0; x < PAGE_SIZE / sizeof(u32); x++) { + prng = next_pseudo_random32(prng); + iowrite32(prng, &s[x]); + } +- io_mapping_unmap_atomic(s); ++ io_mapping_unmap_local(s); + } + + ggtt->vm.clear_range(&ggtt->vm, slot, PAGE_SIZE); +diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c +index 65e28c4cd..ca483285f 100644 +--- a/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c ++++ b/drivers/gpu/drm/i915/selftests/i915_gem_gtt.c +@@ -1201,9 +1201,9 @@ static int igt_ggtt_page(void *arg) + u64 offset = tmp.start + order[n] * PAGE_SIZE; + u32 __iomem *vaddr; + +- vaddr = io_mapping_map_atomic_wc(&ggtt->iomap, offset); ++ vaddr = io_mapping_map_local_wc(&ggtt->iomap, offset); + iowrite32(n, vaddr + n); +- io_mapping_unmap_atomic(vaddr); ++ io_mapping_unmap_local(vaddr); + } + intel_gt_flush_ggtt_writes(ggtt->vm.gt); + +@@ -1213,9 +1213,9 @@ static int igt_ggtt_page(void *arg) + u32 __iomem *vaddr; + u32 val; + +- vaddr = io_mapping_map_atomic_wc(&ggtt->iomap, offset); ++ vaddr = io_mapping_map_local_wc(&ggtt->iomap, offset); + val = ioread32(vaddr + n); +- io_mapping_unmap_atomic(vaddr); ++ io_mapping_unmap_local(vaddr); + + if (val != n) { + pr_err("insert page failed: found %d, expected %d\n", +diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/fbmem.h b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/fbmem.h +index 6c5bbff12..411f91ee2 100644 +--- a/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/fbmem.h ++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/devinit/fbmem.h +@@ -60,19 +60,19 @@ fbmem_fini(struct io_mapping *fb) + static inline u32 + fbmem_peek(struct io_mapping *fb, u32 off) + { +- u8 __iomem *p = io_mapping_map_atomic_wc(fb, off & PAGE_MASK); ++ u8 __iomem *p = io_mapping_map_local_wc(fb, off & PAGE_MASK); + u32 val = ioread32(p + (off & ~PAGE_MASK)); +- io_mapping_unmap_atomic(p); ++ io_mapping_unmap_local(p); + return val; + } + + static inline void + fbmem_poke(struct io_mapping *fb, u32 off, u32 val) + { +- u8 __iomem *p = io_mapping_map_atomic_wc(fb, off & PAGE_MASK); ++ u8 __iomem *p = io_mapping_map_local_wc(fb, off & PAGE_MASK); + iowrite32(val, p + (off & ~PAGE_MASK)); + wmb(); +- io_mapping_unmap_atomic(p); ++ io_mapping_unmap_local(p); + } + + static inline bool +diff --git a/drivers/gpu/drm/qxl/qxl_image.c b/drivers/gpu/drm/qxl/qxl_image.c +index 60ab7151b..93f92ccd4 100644 +--- a/drivers/gpu/drm/qxl/qxl_image.c ++++ b/drivers/gpu/drm/qxl/qxl_image.c +@@ -124,12 +124,12 @@ qxl_image_init_helper(struct qxl_device *qdev, + wrong (check the bitmaps are sent correctly + first) */ + +- ptr = qxl_bo_kmap_atomic_page(qdev, chunk_bo, 0); ++ ptr = qxl_bo_kmap_local_page(qdev, chunk_bo, 0); + chunk = ptr; + chunk->data_size = height * chunk_stride; + chunk->prev_chunk = 0; + chunk->next_chunk = 0; +- qxl_bo_kunmap_atomic_page(qdev, chunk_bo, ptr); ++ qxl_bo_kunmap_local_page(qdev, chunk_bo, ptr); + + { + void *k_data, *i_data; +@@ -143,7 +143,7 @@ qxl_image_init_helper(struct qxl_device *qdev, + i_data = (void *)data; + + while (remain > 0) { +- ptr = qxl_bo_kmap_atomic_page(qdev, chunk_bo, page << PAGE_SHIFT); ++ ptr = qxl_bo_kmap_local_page(qdev, chunk_bo, page << PAGE_SHIFT); + + if (page == 0) { + chunk = ptr; +@@ -157,7 +157,7 @@ qxl_image_init_helper(struct qxl_device *qdev, + + memcpy(k_data, i_data, size); + +- qxl_bo_kunmap_atomic_page(qdev, chunk_bo, ptr); ++ qxl_bo_kunmap_local_page(qdev, chunk_bo, ptr); + i_data += size; + remain -= size; + page++; +@@ -175,10 +175,10 @@ qxl_image_init_helper(struct qxl_device *qdev, + page_offset = offset_in_page(out_offset); + size = min((int)(PAGE_SIZE - page_offset), remain); + +- ptr = qxl_bo_kmap_atomic_page(qdev, chunk_bo, page_base); ++ ptr = qxl_bo_kmap_local_page(qdev, chunk_bo, page_base); + k_data = ptr + page_offset; + memcpy(k_data, i_data, size); +- qxl_bo_kunmap_atomic_page(qdev, chunk_bo, ptr); ++ qxl_bo_kunmap_local_page(qdev, chunk_bo, ptr); + remain -= size; + i_data += size; + out_offset += size; +@@ -189,7 +189,7 @@ qxl_image_init_helper(struct qxl_device *qdev, + qxl_bo_kunmap(chunk_bo); + + image_bo = dimage->bo; +- ptr = qxl_bo_kmap_atomic_page(qdev, image_bo, 0); ++ ptr = qxl_bo_kmap_local_page(qdev, image_bo, 0); + image = ptr; + + image->descriptor.id = 0; +@@ -212,7 +212,7 @@ qxl_image_init_helper(struct qxl_device *qdev, + break; + default: + DRM_ERROR("unsupported image bit depth\n"); +- qxl_bo_kunmap_atomic_page(qdev, image_bo, ptr); ++ qxl_bo_kunmap_local_page(qdev, image_bo, ptr); + return -EINVAL; + } + image->u.bitmap.flags = QXL_BITMAP_TOP_DOWN; +@@ -222,7 +222,7 @@ qxl_image_init_helper(struct qxl_device *qdev, + image->u.bitmap.palette = 0; + image->u.bitmap.data = qxl_bo_physical_address(qdev, chunk_bo, 0); + +- qxl_bo_kunmap_atomic_page(qdev, image_bo, ptr); ++ qxl_bo_kunmap_local_page(qdev, image_bo, ptr); + + return 0; + } +diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c +index 5cea6eea7..785023081 100644 +--- a/drivers/gpu/drm/qxl/qxl_ioctl.c ++++ b/drivers/gpu/drm/qxl/qxl_ioctl.c +@@ -89,11 +89,11 @@ apply_reloc(struct qxl_device *qdev, struct qxl_reloc_info *info) + { + void *reloc_page; + +- reloc_page = qxl_bo_kmap_atomic_page(qdev, info->dst_bo, info->dst_offset & PAGE_MASK); ++ reloc_page = qxl_bo_kmap_local_page(qdev, info->dst_bo, info->dst_offset & PAGE_MASK); + *(uint64_t *)(reloc_page + (info->dst_offset & ~PAGE_MASK)) = qxl_bo_physical_address(qdev, + info->src_bo, + info->src_offset); +- qxl_bo_kunmap_atomic_page(qdev, info->dst_bo, reloc_page); ++ qxl_bo_kunmap_local_page(qdev, info->dst_bo, reloc_page); + } + + static void +@@ -105,9 +105,9 @@ apply_surf_reloc(struct qxl_device *qdev, struct qxl_reloc_info *info) + if (info->src_bo && !info->src_bo->is_primary) + id = info->src_bo->surface_id; + +- reloc_page = qxl_bo_kmap_atomic_page(qdev, info->dst_bo, info->dst_offset & PAGE_MASK); ++ reloc_page = qxl_bo_kmap_local_page(qdev, info->dst_bo, info->dst_offset & PAGE_MASK); + *(uint32_t *)(reloc_page + (info->dst_offset & ~PAGE_MASK)) = id; +- qxl_bo_kunmap_atomic_page(qdev, info->dst_bo, reloc_page); ++ qxl_bo_kunmap_local_page(qdev, info->dst_bo, reloc_page); + } + + /* return holding the reference to this object */ +@@ -149,7 +149,6 @@ static int qxl_process_single_command(struct qxl_device *qdev, + struct qxl_bo *cmd_bo; + void *fb_cmd; + int i, ret, num_relocs; +- int unwritten; + + switch (cmd->type) { + case QXL_CMD_DRAW: +@@ -185,21 +184,21 @@ static int qxl_process_single_command(struct qxl_device *qdev, + goto out_free_reloc; + + /* TODO copy slow path code from i915 */ +- fb_cmd = qxl_bo_kmap_atomic_page(qdev, cmd_bo, (release->release_offset & PAGE_MASK)); +- unwritten = __copy_from_user_inatomic_nocache +- (fb_cmd + sizeof(union qxl_release_info) + (release->release_offset & ~PAGE_MASK), +- u64_to_user_ptr(cmd->command), cmd->command_size); ++ fb_cmd = qxl_bo_kmap_local_page(qdev, cmd_bo, (release->release_offset & PAGE_MASK)); + +- { ++ if (copy_from_user(fb_cmd + sizeof(union qxl_release_info) + ++ (release->release_offset & ~PAGE_MASK), ++ u64_to_user_ptr(cmd->command), cmd->command_size)) { ++ ret = -EFAULT; ++ } else { + struct qxl_drawable *draw = fb_cmd; + + draw->mm_time = qdev->rom->mm_clock; + } + +- qxl_bo_kunmap_atomic_page(qdev, cmd_bo, fb_cmd); +- if (unwritten) { +- DRM_ERROR("got unwritten %d\n", unwritten); +- ret = -EFAULT; ++ qxl_bo_kunmap_local_page(qdev, cmd_bo, fb_cmd); ++ if (ret) { ++ DRM_ERROR("copy from user failed %d\n", ret); + goto out_free_release; + } + +diff --git a/drivers/gpu/drm/qxl/qxl_object.c b/drivers/gpu/drm/qxl/qxl_object.c +index 544a9e4df..5ee5171d4 100644 +--- a/drivers/gpu/drm/qxl/qxl_object.c ++++ b/drivers/gpu/drm/qxl/qxl_object.c +@@ -173,8 +173,8 @@ int qxl_bo_kmap(struct qxl_bo *bo, void **ptr) + return 0; + } + +-void *qxl_bo_kmap_atomic_page(struct qxl_device *qdev, +- struct qxl_bo *bo, int page_offset) ++void *qxl_bo_kmap_local_page(struct qxl_device *qdev, ++ struct qxl_bo *bo, int page_offset) + { + unsigned long offset; + void *rptr; +@@ -189,7 +189,7 @@ void *qxl_bo_kmap_atomic_page(struct qxl_device *qdev, + goto fallback; + + offset = bo->tbo.mem.start << PAGE_SHIFT; +- return io_mapping_map_atomic_wc(map, offset + page_offset); ++ return io_mapping_map_local_wc(map, offset + page_offset); + fallback: + if (bo->kptr) { + rptr = bo->kptr + (page_offset * PAGE_SIZE); +@@ -215,14 +215,14 @@ void qxl_bo_kunmap(struct qxl_bo *bo) + ttm_bo_kunmap(&bo->kmap); + } + +-void qxl_bo_kunmap_atomic_page(struct qxl_device *qdev, +- struct qxl_bo *bo, void *pmap) ++void qxl_bo_kunmap_local_page(struct qxl_device *qdev, ++ struct qxl_bo *bo, void *pmap) + { + if ((bo->tbo.mem.mem_type != TTM_PL_VRAM) && + (bo->tbo.mem.mem_type != TTM_PL_PRIV)) + goto fallback; + +- io_mapping_unmap_atomic(pmap); ++ io_mapping_unmap_local(pmap); + return; + fallback: + qxl_bo_kunmap(bo); +diff --git a/drivers/gpu/drm/qxl/qxl_object.h b/drivers/gpu/drm/qxl/qxl_object.h +index 5762ea40d..6ae89b1b3 100644 +--- a/drivers/gpu/drm/qxl/qxl_object.h ++++ b/drivers/gpu/drm/qxl/qxl_object.h +@@ -89,8 +89,8 @@ extern int qxl_bo_create(struct qxl_device *qdev, + struct qxl_bo **bo_ptr); + extern int qxl_bo_kmap(struct qxl_bo *bo, void **ptr); + extern void qxl_bo_kunmap(struct qxl_bo *bo); +-void *qxl_bo_kmap_atomic_page(struct qxl_device *qdev, struct qxl_bo *bo, int page_offset); +-void qxl_bo_kunmap_atomic_page(struct qxl_device *qdev, struct qxl_bo *bo, void *map); ++void *qxl_bo_kmap_local_page(struct qxl_device *qdev, struct qxl_bo *bo, int page_offset); ++void qxl_bo_kunmap_local_page(struct qxl_device *qdev, struct qxl_bo *bo, void *map); + extern struct qxl_bo *qxl_bo_ref(struct qxl_bo *bo); + extern void qxl_bo_unref(struct qxl_bo **bo); + extern int qxl_bo_pin(struct qxl_bo *bo); +diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c +index b2a475a0c..b665a33b4 100644 +--- a/drivers/gpu/drm/qxl/qxl_release.c ++++ b/drivers/gpu/drm/qxl/qxl_release.c +@@ -414,7 +414,7 @@ union qxl_release_info *qxl_release_map(struct qxl_device *qdev, + union qxl_release_info *info; + struct qxl_bo *bo = release->release_bo; + +- ptr = qxl_bo_kmap_atomic_page(qdev, bo, release->release_offset & PAGE_MASK); ++ ptr = qxl_bo_kmap_local_page(qdev, bo, release->release_offset & PAGE_MASK); + if (!ptr) + return NULL; + info = ptr + (release->release_offset & ~PAGE_MASK); +@@ -429,7 +429,7 @@ void qxl_release_unmap(struct qxl_device *qdev, + void *ptr; + + ptr = ((void *)info) - (release->release_offset & ~PAGE_MASK); +- qxl_bo_kunmap_atomic_page(qdev, bo, ptr); ++ qxl_bo_kunmap_local_page(qdev, bo, ptr); + } + + void qxl_release_fence_buffer_objects(struct qxl_release *release) +diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c +index 07d23a1e6..add8e6044 100644 +--- a/drivers/gpu/drm/radeon/radeon_display.c ++++ b/drivers/gpu/drm/radeon/radeon_display.c +@@ -1828,6 +1828,7 @@ int radeon_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe, + struct radeon_device *rdev = dev->dev_private; + + /* preempt_disable_rt() should go right here in PREEMPT_RT patchset. */ ++ preempt_disable_rt(); + + /* Get optional system timestamp before query. */ + if (stime) +@@ -1920,6 +1921,7 @@ int radeon_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe, + *etime = ktime_get(); + + /* preempt_enable_rt() should go right here in PREEMPT_RT patchset. */ ++ preempt_enable_rt(); + + /* Decode into vertical and horizontal scanout position. */ + *vpos = position & 0x1fff; +diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c +index fb2a25f84..164b9a015 100644 +--- a/drivers/gpu/drm/ttm/ttm_bo_util.c ++++ b/drivers/gpu/drm/ttm/ttm_bo_util.c +@@ -181,13 +181,15 @@ static int ttm_copy_io_ttm_page(struct ttm_tt *ttm, void *src, + return -ENOMEM; + + src = (void *)((unsigned long)src + (page << PAGE_SHIFT)); +- dst = kmap_atomic_prot(d, prot); +- if (!dst) +- return -ENOMEM; ++ /* ++ * Ensure that a highmem page is mapped with the correct ++ * pgprot. For non highmem the mapping is already there. ++ */ ++ dst = kmap_local_page_prot(d, prot); + + memcpy_fromio(dst, src, PAGE_SIZE); + +- kunmap_atomic(dst); ++ kunmap_local(dst); + + return 0; + } +@@ -203,13 +205,15 @@ static int ttm_copy_ttm_io_page(struct ttm_tt *ttm, void *dst, + return -ENOMEM; + + dst = (void *)((unsigned long)dst + (page << PAGE_SHIFT)); +- src = kmap_atomic_prot(s, prot); +- if (!src) +- return -ENOMEM; ++ /* ++ * Ensure that a highmem page is mapped with the correct ++ * pgprot. For non highmem the mapping is already there. ++ */ ++ src = kmap_local_page_prot(s, prot); + + memcpy_toio(dst, src, PAGE_SIZE); + +- kunmap_atomic(src); ++ kunmap_local(src); + + return 0; + } +diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c b/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c +index e8d66182c..71dba228f 100644 +--- a/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c ++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c +@@ -375,12 +375,12 @@ static int vmw_bo_cpu_blit_line(struct vmw_bo_blit_line_data *d, + copy_size = min_t(u32, copy_size, PAGE_SIZE - src_page_offset); + + if (unmap_src) { +- kunmap_atomic(d->src_addr); ++ kunmap_local(d->src_addr); + d->src_addr = NULL; + } + + if (unmap_dst) { +- kunmap_atomic(d->dst_addr); ++ kunmap_local(d->dst_addr); + d->dst_addr = NULL; + } + +@@ -388,12 +388,8 @@ static int vmw_bo_cpu_blit_line(struct vmw_bo_blit_line_data *d, + if (WARN_ON_ONCE(dst_page >= d->dst_num_pages)) + return -EINVAL; + +- d->dst_addr = +- kmap_atomic_prot(d->dst_pages[dst_page], +- d->dst_prot); +- if (!d->dst_addr) +- return -ENOMEM; +- ++ d->dst_addr = kmap_local_page_prot(d->dst_pages[dst_page], ++ d->dst_prot); + d->mapped_dst = dst_page; + } + +@@ -401,12 +397,8 @@ static int vmw_bo_cpu_blit_line(struct vmw_bo_blit_line_data *d, + if (WARN_ON_ONCE(src_page >= d->src_num_pages)) + return -EINVAL; + +- d->src_addr = +- kmap_atomic_prot(d->src_pages[src_page], +- d->src_prot); +- if (!d->src_addr) +- return -ENOMEM; +- ++ d->src_addr = kmap_local_page_prot(d->src_pages[src_page], ++ d->src_prot); + d->mapped_src = src_page; + } + diff->do_cpy(diff, d->dst_addr + dst_page_offset, +@@ -436,8 +428,10 @@ static int vmw_bo_cpu_blit_line(struct vmw_bo_blit_line_data *d, + * + * Performs a CPU blit from one buffer object to another avoiding a full + * bo vmap which may exhaust- or fragment vmalloc space. +- * On supported architectures (x86), we're using kmap_atomic which avoids +- * cross-processor TLB- and cache flushes and may, on non-HIGHMEM systems ++ * ++ * On supported architectures (x86), we're using kmap_local_prot() which ++ * avoids cross-processor TLB- and cache flushes. kmap_local_prot() will ++ * either map a highmem page with the proper pgprot on HIGHMEM=y systems or + * reference already set-up mappings. + * + * Neither of the buffer objects may be placed in PCI memory +@@ -500,9 +494,9 @@ int vmw_bo_cpu_blit(struct ttm_buffer_object *dst, + } + out: + if (d.src_addr) +- kunmap_atomic(d.src_addr); ++ kunmap_local(d.src_addr); + if (d.dst_addr) +- kunmap_atomic(d.dst_addr); ++ kunmap_local(d.dst_addr); + + return ret; + } +diff --git a/drivers/hv/hyperv_vmbus.h b/drivers/hv/hyperv_vmbus.h +index 7845fa5de..043e058bb 100644 +--- a/drivers/hv/hyperv_vmbus.h ++++ b/drivers/hv/hyperv_vmbus.h +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + + #include "hv_trace.h" + +diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c +index a5a402e77..d0763ea99 100644 +--- a/drivers/hv/vmbus_drv.c ++++ b/drivers/hv/vmbus_drv.c +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -1307,6 +1308,8 @@ static void vmbus_isr(void) + void *page_addr = hv_cpu->synic_event_page; + struct hv_message *msg; + union hv_synic_event_flags *event; ++ struct pt_regs *regs = get_irq_regs(); ++ u64 ip = regs ? instruction_pointer(regs) : 0; + bool handled = false; + + if (unlikely(page_addr == NULL)) +@@ -1351,7 +1354,7 @@ static void vmbus_isr(void) + tasklet_schedule(&hv_cpu->msg_dpc); + } + +- add_interrupt_randomness(hv_get_vector(), 0); ++ add_interrupt_randomness(hv_get_vector(), 0, ip); + } + + /* +@@ -1359,7 +1362,8 @@ static void vmbus_isr(void) + * buffer and call into Hyper-V to transfer the data. + */ + static void hv_kmsg_dump(struct kmsg_dumper *dumper, +- enum kmsg_dump_reason reason) ++ enum kmsg_dump_reason reason, ++ struct kmsg_dumper_iter *iter) + { + size_t bytes_written; + phys_addr_t panic_pa; +@@ -1374,7 +1378,7 @@ static void hv_kmsg_dump(struct kmsg_dumper *dumper, + * Write dump contents to the page. No need to synchronize; panic should + * be single-threaded. + */ +- kmsg_dump_get_buffer(dumper, false, hv_panic_page, HV_HYP_PAGE_SIZE, ++ kmsg_dump_get_buffer(iter, false, hv_panic_page, HV_HYP_PAGE_SIZE, + &bytes_written); + if (bytes_written) + hyperv_report_panic_msg(panic_pa, bytes_written); +diff --git a/drivers/leds/trigger/Kconfig b/drivers/leds/trigger/Kconfig +index ce9429ca6..29ccbd6ac 100644 +--- a/drivers/leds/trigger/Kconfig ++++ b/drivers/leds/trigger/Kconfig +@@ -64,6 +64,7 @@ config LEDS_TRIGGER_BACKLIGHT + + config LEDS_TRIGGER_CPU + bool "LED CPU Trigger" ++ depends on !PREEMPT_RT + help + This allows LEDs to be controlled by active CPUs. This shows + the active CPUs across an array of LEDs so you can see which +diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c +index c82953a32..061fea763 100644 +--- a/drivers/md/raid5.c ++++ b/drivers/md/raid5.c +@@ -2217,8 +2217,9 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request) + struct raid5_percpu *percpu; + unsigned long cpu; + +- cpu = get_cpu(); ++ cpu = get_cpu_light(); + percpu = per_cpu_ptr(conf->percpu, cpu); ++ spin_lock(&percpu->lock); + if (test_bit(STRIPE_OP_BIOFILL, &ops_request)) { + ops_run_biofill(sh); + overlap_clear++; +@@ -2277,7 +2278,8 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request) + if (test_and_clear_bit(R5_Overlap, &dev->flags)) + wake_up(&sh->raid_conf->wait_for_overlap); + } +- put_cpu(); ++ spin_unlock(&percpu->lock); ++ put_cpu_light(); + } + + static void free_stripe(struct kmem_cache *sc, struct stripe_head *sh) +@@ -7099,6 +7101,7 @@ static int raid456_cpu_up_prepare(unsigned int cpu, struct hlist_node *node) + __func__, cpu); + return -ENOMEM; + } ++ spin_lock_init(&per_cpu_ptr(conf->percpu, cpu)->lock); + return 0; + } + +diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h +index 5c05acf20..665fe138a 100644 +--- a/drivers/md/raid5.h ++++ b/drivers/md/raid5.h +@@ -635,6 +635,7 @@ struct r5conf { + int recovery_disabled; + /* per cpu variables */ + struct raid5_percpu { ++ spinlock_t lock; /* Protection for -RT */ + struct page *spare_page; /* Used when checking P/Q in raid6 */ + void *scribble; /* space for constructing buffer + * lists and performing address +diff --git a/drivers/mtd/mtdoops.c b/drivers/mtd/mtdoops.c +index 774970bfc..6bc2c728a 100644 +--- a/drivers/mtd/mtdoops.c ++++ b/drivers/mtd/mtdoops.c +@@ -267,7 +267,8 @@ static void find_next_position(struct mtdoops_context *cxt) + } + + static void mtdoops_do_dump(struct kmsg_dumper *dumper, +- enum kmsg_dump_reason reason) ++ enum kmsg_dump_reason reason, ++ struct kmsg_dumper_iter *iter) + { + struct mtdoops_context *cxt = container_of(dumper, + struct mtdoops_context, dump); +@@ -276,7 +277,7 @@ static void mtdoops_do_dump(struct kmsg_dumper *dumper, + if (reason == KMSG_DUMP_OOPS && !dump_oops) + return; + +- kmsg_dump_get_buffer(dumper, true, cxt->oops_buf + MTDOOPS_HEADER_SIZE, ++ kmsg_dump_get_buffer(iter, true, cxt->oops_buf + MTDOOPS_HEADER_SIZE, + record_size - MTDOOPS_HEADER_SIZE, NULL); + + if (reason != KMSG_DUMP_OOPS) { +diff --git a/drivers/net/arcnet/arc-rimi.c b/drivers/net/arcnet/arc-rimi.c +index 98df38fe5..12d085405 100644 +--- a/drivers/net/arcnet/arc-rimi.c ++++ b/drivers/net/arcnet/arc-rimi.c +@@ -332,7 +332,7 @@ static int __init arc_rimi_init(void) + dev->irq = 9; + + if (arcrimi_probe(dev)) { +- free_netdev(dev); ++ free_arcdev(dev); + return -EIO; + } + +@@ -349,7 +349,7 @@ static void __exit arc_rimi_exit(void) + iounmap(lp->mem_start); + release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1); + free_irq(dev->irq, dev); +- free_netdev(dev); ++ free_arcdev(dev); + } + + #ifndef MODULE +diff --git a/drivers/net/arcnet/arcdevice.h b/drivers/net/arcnet/arcdevice.h +index 22a49c6d7..5d4a4c7ef 100644 +--- a/drivers/net/arcnet/arcdevice.h ++++ b/drivers/net/arcnet/arcdevice.h +@@ -298,6 +298,10 @@ struct arcnet_local { + + int excnak_pending; /* We just got an excesive nak interrupt */ + ++ /* RESET flag handling */ ++ int reset_in_progress; ++ struct work_struct reset_work; ++ + struct { + uint16_t sequence; /* sequence number (incs with each packet) */ + __be16 aborted_seq; +@@ -350,7 +354,9 @@ void arcnet_dump_skb(struct net_device *dev, struct sk_buff *skb, char *desc) + + void arcnet_unregister_proto(struct ArcProto *proto); + irqreturn_t arcnet_interrupt(int irq, void *dev_id); ++ + struct net_device *alloc_arcdev(const char *name); ++void free_arcdev(struct net_device *dev); + + int arcnet_open(struct net_device *dev); + int arcnet_close(struct net_device *dev); +diff --git a/drivers/net/arcnet/arcnet.c b/drivers/net/arcnet/arcnet.c +index e04efc0a5..d76dd7d14 100644 +--- a/drivers/net/arcnet/arcnet.c ++++ b/drivers/net/arcnet/arcnet.c +@@ -387,10 +387,44 @@ static void arcnet_timer(struct timer_list *t) + struct arcnet_local *lp = from_timer(lp, t, timer); + struct net_device *dev = lp->dev; + +- if (!netif_carrier_ok(dev)) { ++ spin_lock_irq(&lp->lock); ++ ++ if (!lp->reset_in_progress && !netif_carrier_ok(dev)) { + netif_carrier_on(dev); + netdev_info(dev, "link up\n"); + } ++ ++ spin_unlock_irq(&lp->lock); ++} ++ ++static void reset_device_work(struct work_struct *work) ++{ ++ struct arcnet_local *lp; ++ struct net_device *dev; ++ ++ lp = container_of(work, struct arcnet_local, reset_work); ++ dev = lp->dev; ++ ++ /* Do not bring the network interface back up if an ifdown ++ * was already done. ++ */ ++ if (!netif_running(dev) || !lp->reset_in_progress) ++ return; ++ ++ rtnl_lock(); ++ ++ /* Do another check, in case of an ifdown that was triggered in ++ * the small race window between the exit condition above and ++ * acquiring RTNL. ++ */ ++ if (!netif_running(dev) || !lp->reset_in_progress) ++ goto out; ++ ++ dev_close(dev); ++ dev_open(dev, NULL); ++ ++out: ++ rtnl_unlock(); + } + + static void arcnet_reply_tasklet(unsigned long data) +@@ -452,12 +486,25 @@ struct net_device *alloc_arcdev(const char *name) + lp->dev = dev; + spin_lock_init(&lp->lock); + timer_setup(&lp->timer, arcnet_timer, 0); ++ INIT_WORK(&lp->reset_work, reset_device_work); + } + + return dev; + } + EXPORT_SYMBOL(alloc_arcdev); + ++void free_arcdev(struct net_device *dev) ++{ ++ struct arcnet_local *lp = netdev_priv(dev); ++ ++ /* Do not cancel this at ->ndo_close(), as the workqueue itself ++ * indirectly calls the ifdown path through dev_close(). ++ */ ++ cancel_work_sync(&lp->reset_work); ++ free_netdev(dev); ++} ++EXPORT_SYMBOL(free_arcdev); ++ + /* Open/initialize the board. This is called sometime after booting when + * the 'ifconfig' program is run. + * +@@ -587,6 +634,10 @@ int arcnet_close(struct net_device *dev) + + /* shut down the card */ + lp->hw.close(dev); ++ ++ /* reset counters */ ++ lp->reset_in_progress = 0; ++ + module_put(lp->hw.owner); + return 0; + } +@@ -820,6 +871,9 @@ irqreturn_t arcnet_interrupt(int irq, void *dev_id) + + spin_lock_irqsave(&lp->lock, flags); + ++ if (lp->reset_in_progress) ++ goto out; ++ + /* RESET flag was enabled - if device is not running, we must + * clear it right away (but nothing else). + */ +@@ -852,11 +906,14 @@ irqreturn_t arcnet_interrupt(int irq, void *dev_id) + if (status & RESETflag) { + arc_printk(D_NORMAL, dev, "spurious reset (status=%Xh)\n", + status); +- arcnet_close(dev); +- arcnet_open(dev); ++ ++ lp->reset_in_progress = 1; ++ netif_stop_queue(dev); ++ netif_carrier_off(dev); ++ schedule_work(&lp->reset_work); + + /* get out of the interrupt handler! */ +- break; ++ goto out; + } + /* RX is inhibited - we must have received something. + * Prepare to receive into the next buffer. +@@ -1052,6 +1109,7 @@ irqreturn_t arcnet_interrupt(int irq, void *dev_id) + udelay(1); + lp->hw.intmask(dev, lp->intmask); + ++out: + spin_unlock_irqrestore(&lp->lock, flags); + return retval; + } +diff --git a/drivers/net/arcnet/com20020-isa.c b/drivers/net/arcnet/com20020-isa.c +index f983c4ce6..be618e4b9 100644 +--- a/drivers/net/arcnet/com20020-isa.c ++++ b/drivers/net/arcnet/com20020-isa.c +@@ -169,7 +169,7 @@ static int __init com20020_init(void) + dev->irq = 9; + + if (com20020isa_probe(dev)) { +- free_netdev(dev); ++ free_arcdev(dev); + return -EIO; + } + +@@ -182,7 +182,7 @@ static void __exit com20020_exit(void) + unregister_netdev(my_dev); + free_irq(my_dev->irq, my_dev); + release_region(my_dev->base_addr, ARCNET_TOTAL_SIZE); +- free_netdev(my_dev); ++ free_arcdev(my_dev); + } + + #ifndef MODULE +diff --git a/drivers/net/arcnet/com20020-pci.c b/drivers/net/arcnet/com20020-pci.c +index eb7f76753..8bdc44b7e 100644 +--- a/drivers/net/arcnet/com20020-pci.c ++++ b/drivers/net/arcnet/com20020-pci.c +@@ -291,7 +291,7 @@ static void com20020pci_remove(struct pci_dev *pdev) + + unregister_netdev(dev); + free_irq(dev->irq, dev); +- free_netdev(dev); ++ free_arcdev(dev); + } + } + +diff --git a/drivers/net/arcnet/com20020_cs.c b/drivers/net/arcnet/com20020_cs.c +index cf607ffcf..9cc5eb6a8 100644 +--- a/drivers/net/arcnet/com20020_cs.c ++++ b/drivers/net/arcnet/com20020_cs.c +@@ -177,7 +177,7 @@ static void com20020_detach(struct pcmcia_device *link) + dev = info->dev; + if (dev) { + dev_dbg(&link->dev, "kfree...\n"); +- free_netdev(dev); ++ free_arcdev(dev); + } + dev_dbg(&link->dev, "kfree2...\n"); + kfree(info); +diff --git a/drivers/net/arcnet/com90io.c b/drivers/net/arcnet/com90io.c +index cf214b730..3856b447d 100644 +--- a/drivers/net/arcnet/com90io.c ++++ b/drivers/net/arcnet/com90io.c +@@ -396,7 +396,7 @@ static int __init com90io_init(void) + err = com90io_probe(dev); + + if (err) { +- free_netdev(dev); ++ free_arcdev(dev); + return err; + } + +@@ -419,7 +419,7 @@ static void __exit com90io_exit(void) + + free_irq(dev->irq, dev); + release_region(dev->base_addr, ARCNET_TOTAL_SIZE); +- free_netdev(dev); ++ free_arcdev(dev); + } + + module_init(com90io_init) +diff --git a/drivers/net/arcnet/com90xx.c b/drivers/net/arcnet/com90xx.c +index 3dc3d533c..d8dfb9ea0 100644 +--- a/drivers/net/arcnet/com90xx.c ++++ b/drivers/net/arcnet/com90xx.c +@@ -554,7 +554,7 @@ static int __init com90xx_found(int ioaddr, int airq, u_long shmem, + err_release_mem: + release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1); + err_free_dev: +- free_netdev(dev); ++ free_arcdev(dev); + return -EIO; + } + +@@ -672,7 +672,7 @@ static void __exit com90xx_exit(void) + release_region(dev->base_addr, ARCNET_TOTAL_SIZE); + release_mem_region(dev->mem_start, + dev->mem_end - dev->mem_start + 1); +- free_netdev(dev); ++ free_arcdev(dev); + } + } + +diff --git a/drivers/net/ethernet/chelsio/cxgb/common.h b/drivers/net/ethernet/chelsio/cxgb/common.h +index 647506064..0321be773 100644 +--- a/drivers/net/ethernet/chelsio/cxgb/common.h ++++ b/drivers/net/ethernet/chelsio/cxgb/common.h +@@ -238,7 +238,6 @@ struct adapter { + int msg_enable; + u32 mmio_len; + +- struct work_struct ext_intr_handler_task; + struct adapter_params params; + + /* Terminator modules. */ +@@ -257,6 +256,7 @@ struct adapter { + + /* guards async operations */ + spinlock_t async_lock ____cacheline_aligned; ++ u32 pending_thread_intr; + u32 slow_intr_mask; + int t1powersave; + }; +@@ -334,8 +334,7 @@ void t1_interrupts_enable(adapter_t *adapter); + void t1_interrupts_disable(adapter_t *adapter); + void t1_interrupts_clear(adapter_t *adapter); + int t1_elmer0_ext_intr_handler(adapter_t *adapter); +-void t1_elmer0_ext_intr(adapter_t *adapter); +-int t1_slow_intr_handler(adapter_t *adapter); ++irqreturn_t t1_slow_intr_handler(adapter_t *adapter); + + int t1_link_start(struct cphy *phy, struct cmac *mac, struct link_config *lc); + const struct board_info *t1_get_board_info(unsigned int board_id); +@@ -347,7 +346,6 @@ int t1_get_board_rev(adapter_t *adapter, const struct board_info *bi, + int t1_init_hw_modules(adapter_t *adapter); + int t1_init_sw_modules(adapter_t *adapter, const struct board_info *bi); + void t1_free_sw_modules(adapter_t *adapter); +-void t1_fatal_err(adapter_t *adapter); + void t1_link_changed(adapter_t *adapter, int port_id); + void t1_link_negotiated(adapter_t *adapter, int port_id, int link_stat, + int speed, int duplex, int pause); +diff --git a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c +index 1311eac9e..c827273c4 100644 +--- a/drivers/net/ethernet/chelsio/cxgb/cxgb2.c ++++ b/drivers/net/ethernet/chelsio/cxgb/cxgb2.c +@@ -211,9 +211,10 @@ static int cxgb_up(struct adapter *adapter) + t1_interrupts_clear(adapter); + + adapter->params.has_msi = !disable_msi && !pci_enable_msi(adapter->pdev); +- err = request_irq(adapter->pdev->irq, t1_interrupt, +- adapter->params.has_msi ? 0 : IRQF_SHARED, +- adapter->name, adapter); ++ err = request_threaded_irq(adapter->pdev->irq, t1_interrupt, ++ t1_interrupt_thread, ++ adapter->params.has_msi ? 0 : IRQF_SHARED, ++ adapter->name, adapter); + if (err) { + if (adapter->params.has_msi) + pci_disable_msi(adapter->pdev); +@@ -924,51 +925,6 @@ static void mac_stats_task(struct work_struct *work) + spin_unlock(&adapter->work_lock); + } + +-/* +- * Processes elmer0 external interrupts in process context. +- */ +-static void ext_intr_task(struct work_struct *work) +-{ +- struct adapter *adapter = +- container_of(work, struct adapter, ext_intr_handler_task); +- +- t1_elmer0_ext_intr_handler(adapter); +- +- /* Now reenable external interrupts */ +- spin_lock_irq(&adapter->async_lock); +- adapter->slow_intr_mask |= F_PL_INTR_EXT; +- writel(F_PL_INTR_EXT, adapter->regs + A_PL_CAUSE); +- writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA, +- adapter->regs + A_PL_ENABLE); +- spin_unlock_irq(&adapter->async_lock); +-} +- +-/* +- * Interrupt-context handler for elmer0 external interrupts. +- */ +-void t1_elmer0_ext_intr(struct adapter *adapter) +-{ +- /* +- * Schedule a task to handle external interrupts as we require +- * a process context. We disable EXT interrupts in the interim +- * and let the task reenable them when it's done. +- */ +- adapter->slow_intr_mask &= ~F_PL_INTR_EXT; +- writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA, +- adapter->regs + A_PL_ENABLE); +- schedule_work(&adapter->ext_intr_handler_task); +-} +- +-void t1_fatal_err(struct adapter *adapter) +-{ +- if (adapter->flags & FULL_INIT_DONE) { +- t1_sge_stop(adapter->sge); +- t1_interrupts_disable(adapter); +- } +- pr_alert("%s: encountered fatal error, operation suspended\n", +- adapter->name); +-} +- + static const struct net_device_ops cxgb_netdev_ops = { + .ndo_open = cxgb_open, + .ndo_stop = cxgb_close, +@@ -1070,8 +1026,6 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) + spin_lock_init(&adapter->async_lock); + spin_lock_init(&adapter->mac_lock); + +- INIT_WORK(&adapter->ext_intr_handler_task, +- ext_intr_task); + INIT_DELAYED_WORK(&adapter->stats_update_task, + mac_stats_task); + +diff --git a/drivers/net/ethernet/chelsio/cxgb/sge.c b/drivers/net/ethernet/chelsio/cxgb/sge.c +index 2d9c2b5a6..cda01f22c 100644 +--- a/drivers/net/ethernet/chelsio/cxgb/sge.c ++++ b/drivers/net/ethernet/chelsio/cxgb/sge.c +@@ -940,10 +940,11 @@ void t1_sge_intr_clear(struct sge *sge) + /* + * SGE 'Error' interrupt handler + */ +-int t1_sge_intr_error_handler(struct sge *sge) ++bool t1_sge_intr_error_handler(struct sge *sge) + { + struct adapter *adapter = sge->adapter; + u32 cause = readl(adapter->regs + A_SG_INT_CAUSE); ++ bool wake = false; + + if (adapter->port[0].dev->hw_features & NETIF_F_TSO) + cause &= ~F_PACKET_TOO_BIG; +@@ -967,11 +968,14 @@ int t1_sge_intr_error_handler(struct sge *sge) + sge->stats.pkt_mismatch++; + pr_alert("%s: SGE packet mismatch\n", adapter->name); + } +- if (cause & SGE_INT_FATAL) +- t1_fatal_err(adapter); ++ if (cause & SGE_INT_FATAL) { ++ t1_interrupts_disable(adapter); ++ adapter->pending_thread_intr |= F_PL_INTR_SGE_ERR; ++ wake = true; ++ } + + writel(cause, adapter->regs + A_SG_INT_CAUSE); +- return 0; ++ return wake; + } + + const struct sge_intr_counts *t1_sge_get_intr_counts(const struct sge *sge) +@@ -1619,11 +1623,46 @@ int t1_poll(struct napi_struct *napi, int budget) + return work_done; + } + ++irqreturn_t t1_interrupt_thread(int irq, void *data) ++{ ++ struct adapter *adapter = data; ++ u32 pending_thread_intr; ++ ++ spin_lock_irq(&adapter->async_lock); ++ pending_thread_intr = adapter->pending_thread_intr; ++ adapter->pending_thread_intr = 0; ++ spin_unlock_irq(&adapter->async_lock); ++ ++ if (!pending_thread_intr) ++ return IRQ_NONE; ++ ++ if (pending_thread_intr & F_PL_INTR_EXT) ++ t1_elmer0_ext_intr_handler(adapter); ++ ++ /* This error is fatal, interrupts remain off */ ++ if (pending_thread_intr & F_PL_INTR_SGE_ERR) { ++ pr_alert("%s: encountered fatal error, operation suspended\n", ++ adapter->name); ++ t1_sge_stop(adapter->sge); ++ return IRQ_HANDLED; ++ } ++ ++ spin_lock_irq(&adapter->async_lock); ++ adapter->slow_intr_mask |= F_PL_INTR_EXT; ++ ++ writel(F_PL_INTR_EXT, adapter->regs + A_PL_CAUSE); ++ writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA, ++ adapter->regs + A_PL_ENABLE); ++ spin_unlock_irq(&adapter->async_lock); ++ ++ return IRQ_HANDLED; ++} ++ + irqreturn_t t1_interrupt(int irq, void *data) + { + struct adapter *adapter = data; + struct sge *sge = adapter->sge; +- int handled; ++ irqreturn_t handled; + + if (likely(responses_pending(adapter))) { + writel(F_PL_INTR_SGE_DATA, adapter->regs + A_PL_CAUSE); +@@ -1645,10 +1684,10 @@ irqreturn_t t1_interrupt(int irq, void *data) + handled = t1_slow_intr_handler(adapter); + spin_unlock(&adapter->async_lock); + +- if (!handled) ++ if (handled == IRQ_NONE) + sge->stats.unhandled_irqs++; + +- return IRQ_RETVAL(handled != 0); ++ return handled; + } + + /* +diff --git a/drivers/net/ethernet/chelsio/cxgb/sge.h b/drivers/net/ethernet/chelsio/cxgb/sge.h +index a1ba591b3..716705b96 100644 +--- a/drivers/net/ethernet/chelsio/cxgb/sge.h ++++ b/drivers/net/ethernet/chelsio/cxgb/sge.h +@@ -74,6 +74,7 @@ struct sge *t1_sge_create(struct adapter *, struct sge_params *); + int t1_sge_configure(struct sge *, struct sge_params *); + int t1_sge_set_coalesce_params(struct sge *, struct sge_params *); + void t1_sge_destroy(struct sge *); ++irqreturn_t t1_interrupt_thread(int irq, void *data); + irqreturn_t t1_interrupt(int irq, void *cookie); + int t1_poll(struct napi_struct *, int); + +@@ -81,7 +82,7 @@ netdev_tx_t t1_start_xmit(struct sk_buff *skb, struct net_device *dev); + void t1_vlan_mode(struct adapter *adapter, netdev_features_t features); + void t1_sge_start(struct sge *); + void t1_sge_stop(struct sge *); +-int t1_sge_intr_error_handler(struct sge *); ++bool t1_sge_intr_error_handler(struct sge *sge); + void t1_sge_intr_enable(struct sge *); + void t1_sge_intr_disable(struct sge *); + void t1_sge_intr_clear(struct sge *); +diff --git a/drivers/net/ethernet/chelsio/cxgb/subr.c b/drivers/net/ethernet/chelsio/cxgb/subr.c +index ea0f8741d..310add28f 100644 +--- a/drivers/net/ethernet/chelsio/cxgb/subr.c ++++ b/drivers/net/ethernet/chelsio/cxgb/subr.c +@@ -170,7 +170,7 @@ void t1_link_changed(adapter_t *adapter, int port_id) + t1_link_negotiated(adapter, port_id, link_ok, speed, duplex, fc); + } + +-static int t1_pci_intr_handler(adapter_t *adapter) ++static bool t1_pci_intr_handler(adapter_t *adapter) + { + u32 pcix_cause; + +@@ -179,9 +179,13 @@ static int t1_pci_intr_handler(adapter_t *adapter) + if (pcix_cause) { + pci_write_config_dword(adapter->pdev, A_PCICFG_INTR_CAUSE, + pcix_cause); +- t1_fatal_err(adapter); /* PCI errors are fatal */ ++ /* PCI errors are fatal */ ++ t1_interrupts_disable(adapter); ++ adapter->pending_thread_intr |= F_PL_INTR_SGE_ERR; ++ pr_alert("%s: PCI error encountered.\n", adapter->name); ++ return true; + } +- return 0; ++ return false; + } + + #ifdef CONFIG_CHELSIO_T1_1G +@@ -210,13 +214,16 @@ static int fpga_phy_intr_handler(adapter_t *adapter) + /* + * Slow path interrupt handler for FPGAs. + */ +-static int fpga_slow_intr(adapter_t *adapter) ++static irqreturn_t fpga_slow_intr(adapter_t *adapter) + { + u32 cause = readl(adapter->regs + A_PL_CAUSE); ++ irqreturn_t ret = IRQ_NONE; + + cause &= ~F_PL_INTR_SGE_DATA; +- if (cause & F_PL_INTR_SGE_ERR) +- t1_sge_intr_error_handler(adapter->sge); ++ if (cause & F_PL_INTR_SGE_ERR) { ++ if (t1_sge_intr_error_handler(adapter->sge)) ++ ret = IRQ_WAKE_THREAD; ++ } + + if (cause & FPGA_PCIX_INTERRUPT_GMAC) + fpga_phy_intr_handler(adapter); +@@ -231,14 +238,19 @@ static int fpga_slow_intr(adapter_t *adapter) + /* Clear TP interrupt */ + writel(tp_cause, adapter->regs + FPGA_TP_ADDR_INTERRUPT_CAUSE); + } +- if (cause & FPGA_PCIX_INTERRUPT_PCIX) +- t1_pci_intr_handler(adapter); ++ if (cause & FPGA_PCIX_INTERRUPT_PCIX) { ++ if (t1_pci_intr_handler(adapter)) ++ ret = IRQ_WAKE_THREAD; ++ } + + /* Clear the interrupts just processed. */ + if (cause) + writel(cause, adapter->regs + A_PL_CAUSE); + +- return cause != 0; ++ if (ret != IRQ_NONE) ++ return ret; ++ ++ return cause == 0 ? IRQ_NONE : IRQ_HANDLED; + } + #endif + +@@ -842,31 +854,45 @@ void t1_interrupts_clear(adapter_t* adapter) + /* + * Slow path interrupt handler for ASICs. + */ +-static int asic_slow_intr(adapter_t *adapter) ++static irqreturn_t asic_slow_intr(adapter_t *adapter) + { + u32 cause = readl(adapter->regs + A_PL_CAUSE); ++ irqreturn_t ret = IRQ_HANDLED; + + cause &= adapter->slow_intr_mask; + if (!cause) +- return 0; +- if (cause & F_PL_INTR_SGE_ERR) +- t1_sge_intr_error_handler(adapter->sge); ++ return IRQ_NONE; ++ if (cause & F_PL_INTR_SGE_ERR) { ++ if (t1_sge_intr_error_handler(adapter->sge)) ++ ret = IRQ_WAKE_THREAD; ++ } + if (cause & F_PL_INTR_TP) + t1_tp_intr_handler(adapter->tp); + if (cause & F_PL_INTR_ESPI) + t1_espi_intr_handler(adapter->espi); +- if (cause & F_PL_INTR_PCIX) +- t1_pci_intr_handler(adapter); +- if (cause & F_PL_INTR_EXT) +- t1_elmer0_ext_intr(adapter); ++ if (cause & F_PL_INTR_PCIX) { ++ if (t1_pci_intr_handler(adapter)) ++ ret = IRQ_WAKE_THREAD; ++ } ++ if (cause & F_PL_INTR_EXT) { ++ /* Wake the threaded interrupt to handle external interrupts as ++ * we require a process context. We disable EXT interrupts in ++ * the interim and let the thread reenable them when it's done. ++ */ ++ adapter->pending_thread_intr |= F_PL_INTR_EXT; ++ adapter->slow_intr_mask &= ~F_PL_INTR_EXT; ++ writel(adapter->slow_intr_mask | F_PL_INTR_SGE_DATA, ++ adapter->regs + A_PL_ENABLE); ++ ret = IRQ_WAKE_THREAD; ++ } + + /* Clear the interrupts just processed. */ + writel(cause, adapter->regs + A_PL_CAUSE); + readl(adapter->regs + A_PL_CAUSE); /* flush writes */ +- return 1; ++ return ret; + } + +-int t1_slow_intr_handler(adapter_t *adapter) ++irqreturn_t t1_slow_intr_handler(adapter_t *adapter) + { + #ifdef CONFIG_CHELSIO_T1_1G + if (!t1_is_asic(adapter)) +diff --git a/drivers/net/ethernet/dlink/sundance.c b/drivers/net/ethernet/dlink/sundance.c +index e3a885891..df0eab479 100644 +--- a/drivers/net/ethernet/dlink/sundance.c ++++ b/drivers/net/ethernet/dlink/sundance.c +@@ -963,7 +963,7 @@ static void tx_timeout(struct net_device *dev, unsigned int txqueue) + unsigned long flag; + + netif_stop_queue(dev); +- tasklet_disable(&np->tx_tasklet); ++ tasklet_disable_in_atomic(&np->tx_tasklet); + iowrite16(0, ioaddr + IntrEnable); + printk(KERN_WARNING "%s: Transmit timed out, TxStatus %2.2x " + "TxFrameId %2.2x," +diff --git a/drivers/net/ethernet/jme.c b/drivers/net/ethernet/jme.c +index 4185ca3dd..cf5c33d0f 100644 +--- a/drivers/net/ethernet/jme.c ++++ b/drivers/net/ethernet/jme.c +@@ -1265,9 +1265,9 @@ jme_stop_shutdown_timer(struct jme_adapter *jme) + jwrite32f(jme, JME_APMC, apmc); + } + +-static void jme_link_change_tasklet(struct tasklet_struct *t) ++static void jme_link_change_work(struct work_struct *work) + { +- struct jme_adapter *jme = from_tasklet(jme, t, linkch_task); ++ struct jme_adapter *jme = container_of(work, struct jme_adapter, linkch_task); + struct net_device *netdev = jme->dev; + int rc; + +@@ -1510,7 +1510,7 @@ jme_intr_msi(struct jme_adapter *jme, u32 intrstat) + * all other events are ignored + */ + jwrite32(jme, JME_IEVE, intrstat); +- tasklet_schedule(&jme->linkch_task); ++ schedule_work(&jme->linkch_task); + goto out_reenable; + } + +@@ -1832,7 +1832,6 @@ jme_open(struct net_device *netdev) + jme_clear_pm_disable_wol(jme); + JME_NAPI_ENABLE(jme); + +- tasklet_setup(&jme->linkch_task, jme_link_change_tasklet); + tasklet_setup(&jme->txclean_task, jme_tx_clean_tasklet); + tasklet_setup(&jme->rxclean_task, jme_rx_clean_tasklet); + tasklet_setup(&jme->rxempty_task, jme_rx_empty_tasklet); +@@ -1920,7 +1919,7 @@ jme_close(struct net_device *netdev) + + JME_NAPI_DISABLE(jme); + +- tasklet_kill(&jme->linkch_task); ++ cancel_work_sync(&jme->linkch_task); + tasklet_kill(&jme->txclean_task); + tasklet_kill(&jme->rxclean_task); + tasklet_kill(&jme->rxempty_task); +@@ -3039,6 +3038,7 @@ jme_init_one(struct pci_dev *pdev, + atomic_set(&jme->rx_empty, 1); + + tasklet_setup(&jme->pcc_task, jme_pcc_tasklet); ++ INIT_WORK(&jme->linkch_task, jme_link_change_work); + jme->dpi.cur = PCC_P1; + + jme->reg_ghc = 0; +diff --git a/drivers/net/ethernet/jme.h b/drivers/net/ethernet/jme.h +index a2c3b00d9..2af76329b 100644 +--- a/drivers/net/ethernet/jme.h ++++ b/drivers/net/ethernet/jme.h +@@ -411,7 +411,7 @@ struct jme_adapter { + struct tasklet_struct rxempty_task; + struct tasklet_struct rxclean_task; + struct tasklet_struct txclean_task; +- struct tasklet_struct linkch_task; ++ struct work_struct linkch_task; + struct tasklet_struct pcc_task; + unsigned long flags; + u32 reg_txcs; +diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c +index 71e2ada86..72e2e71aa 100644 +--- a/drivers/net/wireless/ath/ath9k/beacon.c ++++ b/drivers/net/wireless/ath/ath9k/beacon.c +@@ -251,7 +251,7 @@ void ath9k_beacon_ensure_primary_slot(struct ath_softc *sc) + int first_slot = ATH_BCBUF; + int slot; + +- tasklet_disable(&sc->bcon_tasklet); ++ tasklet_disable_in_atomic(&sc->bcon_tasklet); + + /* Find first taken slot. */ + for (slot = 0; slot < ATH_BCBUF; slot++) { +diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c +index ad3e3cde1..c0b8911bd 100644 +--- a/drivers/pci/controller/pci-hyperv.c ++++ b/drivers/pci/controller/pci-hyperv.c +@@ -1457,7 +1457,7 @@ static void hv_compose_msi_msg(struct irq_data *data, struct msi_msg *msg) + * Prevents hv_pci_onchannelcallback() from running concurrently + * in the tasklet. + */ +- tasklet_disable(&channel->callback_event); ++ tasklet_disable_in_atomic(&channel->callback_event); + + /* + * Since this function is called with IRQ locks held, can't +diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c +index 0f9274960..dc97e4f1f 100644 +--- a/drivers/scsi/fcoe/fcoe.c ++++ b/drivers/scsi/fcoe/fcoe.c +@@ -1452,11 +1452,11 @@ static int fcoe_rcv(struct sk_buff *skb, struct net_device *netdev, + static int fcoe_alloc_paged_crc_eof(struct sk_buff *skb, int tlen) + { + struct fcoe_percpu_s *fps; +- int rc; ++ int rc, cpu = get_cpu_light(); + +- fps = &get_cpu_var(fcoe_percpu); ++ fps = &per_cpu(fcoe_percpu, cpu); + rc = fcoe_get_paged_crc_eof(skb, tlen, fps); +- put_cpu_var(fcoe_percpu); ++ put_cpu_light(); + + return rc; + } +@@ -1641,11 +1641,11 @@ static inline int fcoe_filter_frames(struct fc_lport *lport, + return 0; + } + +- stats = per_cpu_ptr(lport->stats, get_cpu()); ++ stats = per_cpu_ptr(lport->stats, get_cpu_light()); + stats->InvalidCRCCount++; + if (stats->InvalidCRCCount < 5) + printk(KERN_WARNING "fcoe: dropping frame with CRC error\n"); +- put_cpu(); ++ put_cpu_light(); + return -EINVAL; + } + +@@ -1686,7 +1686,7 @@ static void fcoe_recv_frame(struct sk_buff *skb) + */ + hp = (struct fcoe_hdr *) skb_network_header(skb); + +- stats = per_cpu_ptr(lport->stats, get_cpu()); ++ stats = per_cpu_ptr(lport->stats, get_cpu_light()); + if (unlikely(FC_FCOE_DECAPS_VER(hp) != FC_FCOE_VER)) { + if (stats->ErrorFrames < 5) + printk(KERN_WARNING "fcoe: FCoE version " +@@ -1718,13 +1718,13 @@ static void fcoe_recv_frame(struct sk_buff *skb) + goto drop; + + if (!fcoe_filter_frames(lport, fp)) { +- put_cpu(); ++ put_cpu_light(); + fc_exch_recv(lport, fp); + return; + } + drop: + stats->ErrorFrames++; +- put_cpu(); ++ put_cpu_light(); + kfree_skb(skb); + } + +diff --git a/drivers/scsi/fcoe/fcoe_ctlr.c b/drivers/scsi/fcoe/fcoe_ctlr.c +index 5ea426eff..0d6b9acc7 100644 +--- a/drivers/scsi/fcoe/fcoe_ctlr.c ++++ b/drivers/scsi/fcoe/fcoe_ctlr.c +@@ -828,7 +828,7 @@ static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip) + + INIT_LIST_HEAD(&del_list); + +- stats = per_cpu_ptr(fip->lp->stats, get_cpu()); ++ stats = per_cpu_ptr(fip->lp->stats, get_cpu_light()); + + list_for_each_entry_safe(fcf, next, &fip->fcfs, list) { + deadline = fcf->time + fcf->fka_period + fcf->fka_period / 2; +@@ -864,7 +864,7 @@ static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip) + sel_time = fcf->time; + } + } +- put_cpu(); ++ put_cpu_light(); + + list_for_each_entry_safe(fcf, next, &del_list, list) { + /* Removes fcf from current list */ +diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c +index a50f1eef0..0b2acad7c 100644 +--- a/drivers/scsi/libfc/fc_exch.c ++++ b/drivers/scsi/libfc/fc_exch.c +@@ -826,10 +826,10 @@ static struct fc_exch *fc_exch_em_alloc(struct fc_lport *lport, + } + memset(ep, 0, sizeof(*ep)); + +- cpu = get_cpu(); ++ cpu = get_cpu_light(); + pool = per_cpu_ptr(mp->pool, cpu); + spin_lock_bh(&pool->lock); +- put_cpu(); ++ put_cpu_light(); + + /* peek cache of free slot */ + if (pool->left != FC_XID_UNKNOWN) { +diff --git a/drivers/tty/serial/8250/8250.h b/drivers/tty/serial/8250/8250.h +index 34aa2714f..42cd2baa7 100644 +--- a/drivers/tty/serial/8250/8250.h ++++ b/drivers/tty/serial/8250/8250.h +@@ -131,12 +131,55 @@ static inline void serial_dl_write(struct uart_8250_port *up, int value) + up->dl_write(up, value); + } + ++static inline void serial8250_set_IER(struct uart_8250_port *up, ++ unsigned char ier) ++{ ++ struct uart_port *port = &up->port; ++ unsigned int flags; ++ bool is_console; ++ ++ is_console = uart_console(port); ++ ++ if (is_console) ++ console_atomic_lock(&flags); ++ ++ serial_out(up, UART_IER, ier); ++ ++ if (is_console) ++ console_atomic_unlock(flags); ++} ++ ++static inline unsigned char serial8250_clear_IER(struct uart_8250_port *up) ++{ ++ struct uart_port *port = &up->port; ++ unsigned int clearval = 0; ++ unsigned int prior; ++ unsigned int flags; ++ bool is_console; ++ ++ is_console = uart_console(port); ++ ++ if (up->capabilities & UART_CAP_UUE) ++ clearval = UART_IER_UUE; ++ ++ if (is_console) ++ console_atomic_lock(&flags); ++ ++ prior = serial_port_in(port, UART_IER); ++ serial_port_out(port, UART_IER, clearval); ++ ++ if (is_console) ++ console_atomic_unlock(flags); ++ ++ return prior; ++} ++ + static inline bool serial8250_set_THRI(struct uart_8250_port *up) + { + if (up->ier & UART_IER_THRI) + return false; + up->ier |= UART_IER_THRI; +- serial_out(up, UART_IER, up->ier); ++ serial8250_set_IER(up, up->ier); + return true; + } + +@@ -145,7 +188,7 @@ static inline bool serial8250_clear_THRI(struct uart_8250_port *up) + if (!(up->ier & UART_IER_THRI)) + return false; + up->ier &= ~UART_IER_THRI; +- serial_out(up, UART_IER, up->ier); ++ serial8250_set_IER(up, up->ier); + return true; + } + +diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c +index cae61d1eb..47dd23056 100644 +--- a/drivers/tty/serial/8250/8250_core.c ++++ b/drivers/tty/serial/8250/8250_core.c +@@ -274,10 +274,8 @@ static void serial8250_backup_timeout(struct timer_list *t) + * Must disable interrupts or else we risk racing with the interrupt + * based handler. + */ +- if (up->port.irq) { +- ier = serial_in(up, UART_IER); +- serial_out(up, UART_IER, 0); +- } ++ if (up->port.irq) ++ ier = serial8250_clear_IER(up); + + iir = serial_in(up, UART_IIR); + +@@ -300,7 +298,7 @@ static void serial8250_backup_timeout(struct timer_list *t) + serial8250_tx_chars(up); + + if (up->port.irq) +- serial_out(up, UART_IER, ier); ++ serial8250_set_IER(up, ier); + + spin_unlock_irqrestore(&up->port.lock, flags); + +@@ -578,6 +576,14 @@ serial8250_register_ports(struct uart_driver *drv, struct device *dev) + + #ifdef CONFIG_SERIAL_8250_CONSOLE + ++static void univ8250_console_write_atomic(struct console *co, const char *s, ++ unsigned int count) ++{ ++ struct uart_8250_port *up = &serial8250_ports[co->index]; ++ ++ serial8250_console_write_atomic(up, s, count); ++} ++ + static void univ8250_console_write(struct console *co, const char *s, + unsigned int count) + { +@@ -671,6 +677,7 @@ static int univ8250_console_match(struct console *co, char *name, int idx, + + static struct console univ8250_console = { + .name = "ttyS", ++ .write_atomic = univ8250_console_write_atomic, + .write = univ8250_console_write, + .device = uart_console_device, + .setup = univ8250_console_setup, +diff --git a/drivers/tty/serial/8250/8250_fsl.c b/drivers/tty/serial/8250/8250_fsl.c +index fbcc90c31..b33cb454c 100644 +--- a/drivers/tty/serial/8250/8250_fsl.c ++++ b/drivers/tty/serial/8250/8250_fsl.c +@@ -60,9 +60,18 @@ int fsl8250_handle_irq(struct uart_port *port) + + /* Stop processing interrupts on input overrun */ + if ((orig_lsr & UART_LSR_OE) && (up->overrun_backoff_time_ms > 0)) { ++ unsigned int ca_flags; + unsigned long delay; ++ bool is_console; + ++ is_console = uart_console(port); ++ ++ if (is_console) ++ console_atomic_lock(&ca_flags); + up->ier = port->serial_in(port, UART_IER); ++ if (is_console) ++ console_atomic_unlock(ca_flags); ++ + if (up->ier & (UART_IER_RLSI | UART_IER_RDI)) { + port->ops->stop_rx(port); + } else { +diff --git a/drivers/tty/serial/8250/8250_ingenic.c b/drivers/tty/serial/8250/8250_ingenic.c +index 988bf6bcc..bcd26d672 100644 +--- a/drivers/tty/serial/8250/8250_ingenic.c ++++ b/drivers/tty/serial/8250/8250_ingenic.c +@@ -146,6 +146,8 @@ OF_EARLYCON_DECLARE(x1000_uart, "ingenic,x1000-uart", + + static void ingenic_uart_serial_out(struct uart_port *p, int offset, int value) + { ++ unsigned int flags; ++ bool is_console; + int ier; + + switch (offset) { +@@ -167,7 +169,12 @@ static void ingenic_uart_serial_out(struct uart_port *p, int offset, int value) + * If we have enabled modem status IRQs we should enable + * modem mode. + */ ++ is_console = uart_console(p); ++ if (is_console) ++ console_atomic_lock(&flags); + ier = p->serial_in(p, UART_IER); ++ if (is_console) ++ console_atomic_unlock(flags); + + if (ier & UART_IER_MSI) + value |= UART_MCR_MDCE | UART_MCR_FCM; +diff --git a/drivers/tty/serial/8250/8250_mtk.c b/drivers/tty/serial/8250/8250_mtk.c +index fb65dc601..5bc734c70 100644 +--- a/drivers/tty/serial/8250/8250_mtk.c ++++ b/drivers/tty/serial/8250/8250_mtk.c +@@ -218,12 +218,37 @@ static void mtk8250_shutdown(struct uart_port *port) + + static void mtk8250_disable_intrs(struct uart_8250_port *up, int mask) + { +- serial_out(up, UART_IER, serial_in(up, UART_IER) & (~mask)); ++ struct uart_port *port = &up->port; ++ unsigned int flags; ++ unsigned int ier; ++ bool is_console; ++ ++ is_console = uart_console(port); ++ ++ if (is_console) ++ console_atomic_lock(&flags); ++ ++ ier = serial_in(up, UART_IER); ++ serial_out(up, UART_IER, ier & (~mask)); ++ ++ if (is_console) ++ console_atomic_unlock(flags); + } + + static void mtk8250_enable_intrs(struct uart_8250_port *up, int mask) + { +- serial_out(up, UART_IER, serial_in(up, UART_IER) | mask); ++ struct uart_port *port = &up->port; ++ unsigned int flags; ++ unsigned int ier; ++ ++ if (uart_console(port)) ++ console_atomic_lock(&flags); ++ ++ ier = serial_in(up, UART_IER); ++ serial_out(up, UART_IER, ier | mask); ++ ++ if (uart_console(port)) ++ console_atomic_unlock(flags); + } + + static void mtk8250_set_flow_ctrl(struct uart_8250_port *up, int mode) +diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c +index 7c07ebb37..a0a617caa 100644 +--- a/drivers/tty/serial/8250/8250_port.c ++++ b/drivers/tty/serial/8250/8250_port.c +@@ -762,7 +762,7 @@ static void serial8250_set_sleep(struct uart_8250_port *p, int sleep) + serial_out(p, UART_EFR, UART_EFR_ECB); + serial_out(p, UART_LCR, 0); + } +- serial_out(p, UART_IER, sleep ? UART_IERX_SLEEP : 0); ++ serial8250_set_IER(p, sleep ? UART_IERX_SLEEP : 0); + if (p->capabilities & UART_CAP_EFR) { + serial_out(p, UART_LCR, UART_LCR_CONF_MODE_B); + serial_out(p, UART_EFR, efr); +@@ -1436,7 +1436,7 @@ static void serial8250_stop_rx(struct uart_port *port) + + up->ier &= ~(UART_IER_RLSI | UART_IER_RDI); + up->port.read_status_mask &= ~UART_LSR_DR; +- serial_port_out(port, UART_IER, up->ier); ++ serial8250_set_IER(up, up->ier); + + serial8250_rpm_put(up); + } +@@ -1466,7 +1466,7 @@ void serial8250_em485_stop_tx(struct uart_8250_port *p) + serial8250_clear_and_reinit_fifos(p); + + p->ier |= UART_IER_RLSI | UART_IER_RDI; +- serial_port_out(&p->port, UART_IER, p->ier); ++ serial8250_set_IER(p, p->ier); + } + } + EXPORT_SYMBOL_GPL(serial8250_em485_stop_tx); +@@ -1694,7 +1694,7 @@ static void serial8250_disable_ms(struct uart_port *port) + mctrl_gpio_disable_ms(up->gpios); + + up->ier &= ~UART_IER_MSI; +- serial_port_out(port, UART_IER, up->ier); ++ serial8250_set_IER(up, up->ier); + } + + static void serial8250_enable_ms(struct uart_port *port) +@@ -1710,7 +1710,7 @@ static void serial8250_enable_ms(struct uart_port *port) + up->ier |= UART_IER_MSI; + + serial8250_rpm_get(up); +- serial_port_out(port, UART_IER, up->ier); ++ serial8250_set_IER(up, up->ier); + serial8250_rpm_put(up); + } + +@@ -2130,14 +2130,7 @@ static void serial8250_put_poll_char(struct uart_port *port, + struct uart_8250_port *up = up_to_u8250p(port); + + serial8250_rpm_get(up); +- /* +- * First save the IER then disable the interrupts +- */ +- ier = serial_port_in(port, UART_IER); +- if (up->capabilities & UART_CAP_UUE) +- serial_port_out(port, UART_IER, UART_IER_UUE); +- else +- serial_port_out(port, UART_IER, 0); ++ ier = serial8250_clear_IER(up); + + wait_for_xmitr(up, BOTH_EMPTY); + /* +@@ -2150,7 +2143,7 @@ static void serial8250_put_poll_char(struct uart_port *port, + * and restore the IER + */ + wait_for_xmitr(up, BOTH_EMPTY); +- serial_port_out(port, UART_IER, ier); ++ serial8250_set_IER(up, ier); + serial8250_rpm_put(up); + } + +@@ -2453,7 +2446,7 @@ void serial8250_do_shutdown(struct uart_port *port) + */ + spin_lock_irqsave(&port->lock, flags); + up->ier = 0; +- serial_port_out(port, UART_IER, 0); ++ serial8250_set_IER(up, 0); + spin_unlock_irqrestore(&port->lock, flags); + + synchronize_irq(port->irq); +@@ -2809,7 +2802,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, + if (up->capabilities & UART_CAP_RTOIE) + up->ier |= UART_IER_RTOIE; + +- serial_port_out(port, UART_IER, up->ier); ++ serial8250_set_IER(up, up->ier); + + if (up->capabilities & UART_CAP_EFR) { + unsigned char efr = 0; +@@ -3275,7 +3268,7 @@ EXPORT_SYMBOL_GPL(serial8250_set_defaults); + + #ifdef CONFIG_SERIAL_8250_CONSOLE + +-static void serial8250_console_putchar(struct uart_port *port, int ch) ++static void serial8250_console_putchar_locked(struct uart_port *port, int ch) + { + struct uart_8250_port *up = up_to_u8250p(port); + +@@ -3283,6 +3276,18 @@ static void serial8250_console_putchar(struct uart_port *port, int ch) + serial_port_out(port, UART_TX, ch); + } + ++static void serial8250_console_putchar(struct uart_port *port, int ch) ++{ ++ struct uart_8250_port *up = up_to_u8250p(port); ++ unsigned int flags; ++ ++ wait_for_xmitr(up, UART_LSR_THRE); ++ ++ console_atomic_lock(&flags); ++ serial8250_console_putchar_locked(port, ch); ++ console_atomic_unlock(flags); ++} ++ + /* + * Restore serial console when h/w power-off detected + */ +@@ -3304,6 +3309,32 @@ static void serial8250_console_restore(struct uart_8250_port *up) + serial8250_out_MCR(up, UART_MCR_DTR | UART_MCR_RTS); + } + ++void serial8250_console_write_atomic(struct uart_8250_port *up, ++ const char *s, unsigned int count) ++{ ++ struct uart_port *port = &up->port; ++ unsigned int flags; ++ unsigned int ier; ++ ++ console_atomic_lock(&flags); ++ ++ touch_nmi_watchdog(); ++ ++ ier = serial8250_clear_IER(up); ++ ++ if (atomic_fetch_inc(&up->console_printing)) { ++ uart_console_write(port, "\n", 1, ++ serial8250_console_putchar_locked); ++ } ++ uart_console_write(port, s, count, serial8250_console_putchar_locked); ++ atomic_dec(&up->console_printing); ++ ++ wait_for_xmitr(up, BOTH_EMPTY); ++ serial8250_set_IER(up, ier); ++ ++ console_atomic_unlock(flags); ++} ++ + /* + * Print a string to the serial port trying not to disturb + * any possible real use of the port... +@@ -3320,24 +3351,12 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, + struct uart_port *port = &up->port; + unsigned long flags; + unsigned int ier; +- int locked = 1; + + touch_nmi_watchdog(); + +- if (oops_in_progress) +- locked = spin_trylock_irqsave(&port->lock, flags); +- else +- spin_lock_irqsave(&port->lock, flags); +- +- /* +- * First save the IER then disable the interrupts +- */ +- ier = serial_port_in(port, UART_IER); ++ spin_lock_irqsave(&port->lock, flags); + +- if (up->capabilities & UART_CAP_UUE) +- serial_port_out(port, UART_IER, UART_IER_UUE); +- else +- serial_port_out(port, UART_IER, 0); ++ ier = serial8250_clear_IER(up); + + /* check scratch reg to see if port powered off during system sleep */ + if (up->canary && (up->canary != serial_port_in(port, UART_SCR))) { +@@ -3351,7 +3370,9 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, + mdelay(port->rs485.delay_rts_before_send); + } + ++ atomic_inc(&up->console_printing); + uart_console_write(port, s, count, serial8250_console_putchar); ++ atomic_dec(&up->console_printing); + + /* + * Finally, wait for transmitter to become empty +@@ -3364,8 +3385,7 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, + if (em485->tx_stopped) + up->rs485_stop_tx(up); + } +- +- serial_port_out(port, UART_IER, ier); ++ serial8250_set_IER(up, ier); + + /* + * The receive handling will happen properly because the +@@ -3377,8 +3397,7 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, + if (up->msr_saved_flags) + serial8250_modem_status(up); + +- if (locked) +- spin_unlock_irqrestore(&port->lock, flags); ++ spin_unlock_irqrestore(&port->lock, flags); + } + + static unsigned int probe_baud(struct uart_port *port) +@@ -3398,6 +3417,7 @@ static unsigned int probe_baud(struct uart_port *port) + + int serial8250_console_setup(struct uart_port *port, char *options, bool probe) + { ++ struct uart_8250_port *up = up_to_u8250p(port); + int baud = 9600; + int bits = 8; + int parity = 'n'; +@@ -3407,6 +3427,8 @@ int serial8250_console_setup(struct uart_port *port, char *options, bool probe) + if (!port->iobase && !port->membase) + return -ENODEV; + ++ atomic_set(&up->console_printing, 0); ++ + if (options) + uart_parse_options(options, &baud, &parity, &bits, &flow); + else if (probe) +diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c +index 4f2c93789..72c04b582 100644 +--- a/drivers/tty/serial/amba-pl011.c ++++ b/drivers/tty/serial/amba-pl011.c +@@ -2270,18 +2270,24 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) + { + struct uart_amba_port *uap = amba_ports[co->index]; + unsigned int old_cr = 0, new_cr; +- unsigned long flags; ++ unsigned long flags = 0; + int locked = 1; + + clk_enable(uap->clk); + +- local_irq_save(flags); ++ /* ++ * local_irq_save(flags); ++ * ++ * This local_irq_save() is nonsense. If we come in via sysrq ++ * handling then interrupts are already disabled. Aside of ++ * that the port.sysrq check is racy on SMP regardless. ++ */ + if (uap->port.sysrq) + locked = 0; + else if (oops_in_progress) +- locked = spin_trylock(&uap->port.lock); ++ locked = spin_trylock_irqsave(&uap->port.lock, flags); + else +- spin_lock(&uap->port.lock); ++ spin_lock_irqsave(&uap->port.lock, flags); + + /* + * First save the CR then disable the interrupts +@@ -2307,8 +2313,7 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) + pl011_write(old_cr, uap, REG_CR); + + if (locked) +- spin_unlock(&uap->port.lock); +- local_irq_restore(flags); ++ spin_unlock_irqrestore(&uap->port.lock, flags); + + clk_disable(uap->clk); + } +diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c +index 84e815808..342005ed5 100644 +--- a/drivers/tty/serial/omap-serial.c ++++ b/drivers/tty/serial/omap-serial.c +@@ -1311,13 +1311,10 @@ serial_omap_console_write(struct console *co, const char *s, + + pm_runtime_get_sync(up->dev); + +- local_irq_save(flags); +- if (up->port.sysrq) +- locked = 0; +- else if (oops_in_progress) +- locked = spin_trylock(&up->port.lock); ++ if (up->port.sysrq || oops_in_progress) ++ locked = spin_trylock_irqsave(&up->port.lock, flags); + else +- spin_lock(&up->port.lock); ++ spin_lock_irqsave(&up->port.lock, flags); + + /* + * First save the IER then disable the interrupts +@@ -1346,8 +1343,7 @@ serial_omap_console_write(struct console *co, const char *s, + pm_runtime_mark_last_busy(up->dev); + pm_runtime_put_autosuspend(up->dev); + if (locked) +- spin_unlock(&up->port.lock); +- local_irq_restore(flags); ++ spin_unlock_irqrestore(&up->port.lock, flags); + } + + static int __init +diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c +index 713cfa72d..0fc473321 100644 +--- a/drivers/tty/tty_buffer.c ++++ b/drivers/tty/tty_buffer.c +@@ -172,9 +172,7 @@ static struct tty_buffer *tty_buffer_alloc(struct tty_port *port, size_t size) + have queued and recycle that ? */ + if (atomic_read(&port->buf.mem_used) > port->buf.mem_limit) + return NULL; +- printk_safe_enter(); + p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC); +- printk_safe_exit(); + if (p == NULL) + return NULL; + +diff --git a/fs/afs/dir_silly.c b/fs/afs/dir_silly.c +index dae9a57d7..9a6a0ec4d 100644 +--- a/fs/afs/dir_silly.c ++++ b/fs/afs/dir_silly.c +@@ -239,7 +239,7 @@ int afs_silly_iput(struct dentry *dentry, struct inode *inode) + struct dentry *alias; + int ret; + +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + + _enter("%p{%pd},%llx", dentry, dentry, vnode->fid.vnode); + +diff --git a/fs/aio.c b/fs/aio.c +index 5e5333d72..cc16ac777 100644 +--- a/fs/aio.c ++++ b/fs/aio.c +@@ -43,7 +43,6 @@ + #include + #include + +-#include + #include + #include + +@@ -1762,7 +1761,7 @@ static int aio_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync, + list_del_init(&req->wait.entry); + list_del(&iocb->ki_list); + iocb->ki_res.res = mangle_poll(mask); +- if (iocb->ki_eventfd && eventfd_signal_count()) { ++ if (iocb->ki_eventfd && !eventfd_signal_allowed()) { + iocb = NULL; + INIT_WORK(&req->work, aio_poll_put_work); + schedule_work(&req->work); +diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h +index bcc6848bb..fabbf6cc4 100644 +--- a/fs/btrfs/ctree.h ++++ b/fs/btrfs/ctree.h +@@ -17,7 +17,6 @@ + #include + #include + #include +-#include + #include + #include + #include +diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c +index 799be3a5d..d5165a7da 100644 +--- a/fs/cifs/readdir.c ++++ b/fs/cifs/readdir.c +@@ -81,7 +81,7 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name, + struct inode *inode; + struct super_block *sb = parent->d_sb; + struct cifs_sb_info *cifs_sb = CIFS_SB(sb); +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + + cifs_dbg(FYI, "%s: for %s\n", __func__, name->name); + +diff --git a/fs/dcache.c b/fs/dcache.c +index f5b78cc80..b2e0d1a07 100644 +--- a/fs/dcache.c ++++ b/fs/dcache.c +@@ -2566,9 +2566,10 @@ EXPORT_SYMBOL(d_rehash); + static inline unsigned start_dir_add(struct inode *dir) + { + ++ preempt_disable_rt(); + for (;;) { +- unsigned n = dir->i_dir_seq; +- if (!(n & 1) && cmpxchg(&dir->i_dir_seq, n, n + 1) == n) ++ unsigned n = dir->__i_dir_seq; ++ if (!(n & 1) && cmpxchg(&dir->__i_dir_seq, n, n + 1) == n) + return n; + cpu_relax(); + } +@@ -2576,26 +2577,30 @@ static inline unsigned start_dir_add(struct inode *dir) + + static inline void end_dir_add(struct inode *dir, unsigned n) + { +- smp_store_release(&dir->i_dir_seq, n + 2); ++ smp_store_release(&dir->__i_dir_seq, n + 2); ++ preempt_enable_rt(); + } + + static void d_wait_lookup(struct dentry *dentry) + { +- if (d_in_lookup(dentry)) { +- DECLARE_WAITQUEUE(wait, current); +- add_wait_queue(dentry->d_wait, &wait); +- do { +- set_current_state(TASK_UNINTERRUPTIBLE); +- spin_unlock(&dentry->d_lock); +- schedule(); +- spin_lock(&dentry->d_lock); +- } while (d_in_lookup(dentry)); +- } ++ struct swait_queue __wait; ++ ++ if (!d_in_lookup(dentry)) ++ return; ++ ++ INIT_LIST_HEAD(&__wait.task_list); ++ do { ++ prepare_to_swait_exclusive(dentry->d_wait, &__wait, TASK_UNINTERRUPTIBLE); ++ spin_unlock(&dentry->d_lock); ++ schedule(); ++ spin_lock(&dentry->d_lock); ++ } while (d_in_lookup(dentry)); ++ finish_swait(dentry->d_wait, &__wait); + } + + struct dentry *d_alloc_parallel(struct dentry *parent, + const struct qstr *name, +- wait_queue_head_t *wq) ++ struct swait_queue_head *wq) + { + unsigned int hash = name->hash; + struct hlist_bl_head *b = in_lookup_hash(parent, hash); +@@ -2609,7 +2614,7 @@ struct dentry *d_alloc_parallel(struct dentry *parent, + + retry: + rcu_read_lock(); +- seq = smp_load_acquire(&parent->d_inode->i_dir_seq); ++ seq = smp_load_acquire(&parent->d_inode->__i_dir_seq); + r_seq = read_seqbegin(&rename_lock); + dentry = __d_lookup_rcu(parent, name, &d_seq); + if (unlikely(dentry)) { +@@ -2637,7 +2642,7 @@ struct dentry *d_alloc_parallel(struct dentry *parent, + } + + hlist_bl_lock(b); +- if (unlikely(READ_ONCE(parent->d_inode->i_dir_seq) != seq)) { ++ if (unlikely(READ_ONCE(parent->d_inode->__i_dir_seq) != seq)) { + hlist_bl_unlock(b); + rcu_read_unlock(); + goto retry; +@@ -2710,7 +2715,7 @@ void __d_lookup_done(struct dentry *dentry) + hlist_bl_lock(b); + dentry->d_flags &= ~DCACHE_PAR_LOOKUP; + __hlist_bl_del(&dentry->d_u.d_in_lookup_hash); +- wake_up_all(dentry->d_wait); ++ swake_up_all(dentry->d_wait); + dentry->d_wait = NULL; + hlist_bl_unlock(b); + INIT_HLIST_NODE(&dentry->d_u.d_alias); +diff --git a/fs/eventfd.c b/fs/eventfd.c +index df466ef81..9035ca60b 100644 +--- a/fs/eventfd.c ++++ b/fs/eventfd.c +@@ -25,8 +25,6 @@ + #include + #include + +-DEFINE_PER_CPU(int, eventfd_wake_count); +- + static DEFINE_IDA(eventfd_ida); + + struct eventfd_ctx { +@@ -67,21 +65,21 @@ __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n) + * Deadlock or stack overflow issues can happen if we recurse here + * through waitqueue wakeup handlers. If the caller users potentially + * nested waitqueues with custom wakeup handlers, then it should +- * check eventfd_signal_count() before calling this function. If +- * it returns true, the eventfd_signal() call should be deferred to a ++ * check eventfd_signal_allowed() before calling this function. If ++ * it returns false, the eventfd_signal() call should be deferred to a + * safe context. + */ +- if (WARN_ON_ONCE(this_cpu_read(eventfd_wake_count))) ++ if (WARN_ON_ONCE(current->in_eventfd_signal)) + return 0; + + spin_lock_irqsave(&ctx->wqh.lock, flags); +- this_cpu_inc(eventfd_wake_count); ++ current->in_eventfd_signal = 1; + if (ULLONG_MAX - ctx->count < n) + n = ULLONG_MAX - ctx->count; + ctx->count += n; + if (waitqueue_active(&ctx->wqh)) + wake_up_locked_poll(&ctx->wqh, EPOLLIN); +- this_cpu_dec(eventfd_wake_count); ++ current->in_eventfd_signal = 0; + spin_unlock_irqrestore(&ctx->wqh.lock, flags); + + return n; +diff --git a/fs/fscache/internal.h b/fs/fscache/internal.h +index 64aa552b2..7dae569da 100644 +--- a/fs/fscache/internal.h ++++ b/fs/fscache/internal.h +@@ -95,7 +95,6 @@ extern unsigned fscache_debug; + extern struct kobject *fscache_root; + extern struct workqueue_struct *fscache_object_wq; + extern struct workqueue_struct *fscache_op_wq; +-DECLARE_PER_CPU(wait_queue_head_t, fscache_object_cong_wait); + + extern unsigned int fscache_hash(unsigned int salt, unsigned int *data, unsigned int n); + +diff --git a/fs/fscache/main.c b/fs/fscache/main.c +index 4207f98e4..85f8cf3a3 100644 +--- a/fs/fscache/main.c ++++ b/fs/fscache/main.c +@@ -41,8 +41,6 @@ struct kobject *fscache_root; + struct workqueue_struct *fscache_object_wq; + struct workqueue_struct *fscache_op_wq; + +-DEFINE_PER_CPU(wait_queue_head_t, fscache_object_cong_wait); +- + /* these values serve as lower bounds, will be adjusted in fscache_init() */ + static unsigned fscache_object_max_active = 4; + static unsigned fscache_op_max_active = 2; +@@ -138,7 +136,6 @@ unsigned int fscache_hash(unsigned int salt, unsigned int *data, unsigned int n) + static int __init fscache_init(void) + { + unsigned int nr_cpus = num_possible_cpus(); +- unsigned int cpu; + int ret; + + fscache_object_max_active = +@@ -161,9 +158,6 @@ static int __init fscache_init(void) + if (!fscache_op_wq) + goto error_op_wq; + +- for_each_possible_cpu(cpu) +- init_waitqueue_head(&per_cpu(fscache_object_cong_wait, cpu)); +- + ret = fscache_proc_init(); + if (ret < 0) + goto error_proc; +diff --git a/fs/fscache/object.c b/fs/fscache/object.c +index cb2146e02..fb9794dce 100644 +--- a/fs/fscache/object.c ++++ b/fs/fscache/object.c +@@ -807,6 +807,8 @@ void fscache_object_destroy(struct fscache_object *object) + } + EXPORT_SYMBOL(fscache_object_destroy); + ++static DECLARE_WAIT_QUEUE_HEAD(fscache_object_cong_wait); ++ + /* + * enqueue an object for metadata-type processing + */ +@@ -815,16 +817,12 @@ void fscache_enqueue_object(struct fscache_object *object) + _enter("{OBJ%x}", object->debug_id); + + if (fscache_get_object(object, fscache_obj_get_queue) >= 0) { +- wait_queue_head_t *cong_wq = +- &get_cpu_var(fscache_object_cong_wait); + + if (queue_work(fscache_object_wq, &object->work)) { + if (fscache_object_congested()) +- wake_up(cong_wq); ++ wake_up(&fscache_object_cong_wait); + } else + fscache_put_object(object, fscache_obj_put_queue); +- +- put_cpu_var(fscache_object_cong_wait); + } + } + +@@ -842,16 +840,15 @@ void fscache_enqueue_object(struct fscache_object *object) + */ + bool fscache_object_sleep_till_congested(signed long *timeoutp) + { +- wait_queue_head_t *cong_wq = this_cpu_ptr(&fscache_object_cong_wait); + DEFINE_WAIT(wait); + + if (fscache_object_congested()) + return true; + +- add_wait_queue_exclusive(cong_wq, &wait); ++ add_wait_queue_exclusive(&fscache_object_cong_wait, &wait); + if (!fscache_object_congested()) + *timeoutp = schedule_timeout(*timeoutp); +- finish_wait(cong_wq, &wait); ++ finish_wait(&fscache_object_cong_wait, &wait); + + return fscache_object_congested(); + } +diff --git a/fs/fuse/readdir.c b/fs/fuse/readdir.c +index bc2678323..3176913fa 100644 +--- a/fs/fuse/readdir.c ++++ b/fs/fuse/readdir.c +@@ -158,7 +158,7 @@ static int fuse_direntplus_link(struct file *file, + struct inode *dir = d_inode(parent); + struct fuse_conn *fc; + struct inode *inode; +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + + if (!o->nodeid) { + /* +diff --git a/fs/inode.c b/fs/inode.c +index 82090bfad..96ddef6c6 100644 +--- a/fs/inode.c ++++ b/fs/inode.c +@@ -158,7 +158,7 @@ int inode_init_always(struct super_block *sb, struct inode *inode) + inode->i_bdev = NULL; + inode->i_cdev = NULL; + inode->i_link = NULL; +- inode->i_dir_seq = 0; ++ inode->__i_dir_seq = 0; + inode->i_rdev = 0; + inode->dirtied_when = 0; + +diff --git a/fs/namei.c b/fs/namei.c +index c94a814e8..36abc074d 100644 +--- a/fs/namei.c ++++ b/fs/namei.c +@@ -1526,7 +1526,7 @@ static struct dentry *__lookup_slow(const struct qstr *name, + { + struct dentry *dentry, *old; + struct inode *inode = dir->d_inode; +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + + /* Don't go there if it's already dead */ + if (unlikely(IS_DEADDIR(inode))) +@@ -3021,7 +3021,7 @@ static struct dentry *lookup_open(struct nameidata *nd, struct file *file, + struct dentry *dentry; + int error, create_error = 0; + umode_t mode = op->mode; +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + + if (unlikely(IS_DEADDIR(dir_inode))) + return ERR_PTR(-ENOENT); +diff --git a/fs/namespace.c b/fs/namespace.c +index 6e76f2a72..dbd1119a5 100644 +--- a/fs/namespace.c ++++ b/fs/namespace.c +@@ -14,6 +14,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -322,8 +323,11 @@ int __mnt_want_write(struct vfsmount *m) + * incremented count after it has set MNT_WRITE_HOLD. + */ + smp_mb(); +- while (READ_ONCE(mnt->mnt.mnt_flags) & MNT_WRITE_HOLD) +- cpu_relax(); ++ while (READ_ONCE(mnt->mnt.mnt_flags) & MNT_WRITE_HOLD) { ++ preempt_enable(); ++ cpu_chill(); ++ preempt_disable(); ++ } + /* + * After the slowpath clears MNT_WRITE_HOLD, mnt_is_readonly will + * be set to match its requirements. So we must not load that until +diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c +index 8428e4135..c9ce840e6 100644 +--- a/fs/nfs/dir.c ++++ b/fs/nfs/dir.c +@@ -484,7 +484,7 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry, + unsigned long dir_verifier) + { + struct qstr filename = QSTR_INIT(entry->name, entry->len); +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + struct dentry *dentry; + struct dentry *alias; + struct inode *inode; +@@ -1670,7 +1670,7 @@ int nfs_atomic_open(struct inode *dir, struct dentry *dentry, + struct file *file, unsigned open_flags, + umode_t mode) + { +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + struct nfs_open_context *ctx; + struct dentry *res; + struct iattr attr = { .ia_valid = ATTR_OPEN }; +diff --git a/fs/nfs/unlink.c b/fs/nfs/unlink.c +index b27ebdcce..f86c98a7e 100644 +--- a/fs/nfs/unlink.c ++++ b/fs/nfs/unlink.c +@@ -13,7 +13,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + +@@ -180,7 +180,7 @@ nfs_async_unlink(struct dentry *dentry, const struct qstr *name) + + data->cred = get_current_cred(); + data->res.dir_attr = &data->dir_attr; +- init_waitqueue_head(&data->wq); ++ init_swait_queue_head(&data->wq); + + status = -EBUSY; + spin_lock(&dentry->d_lock); +diff --git a/fs/proc/array.c b/fs/proc/array.c +index 18a4588c3..decaa7768 100644 +--- a/fs/proc/array.c ++++ b/fs/proc/array.c +@@ -384,9 +384,9 @@ static inline void task_context_switch_counts(struct seq_file *m, + static void task_cpus_allowed(struct seq_file *m, struct task_struct *task) + { + seq_printf(m, "Cpus_allowed:\t%*pb\n", +- cpumask_pr_args(task->cpus_ptr)); ++ cpumask_pr_args(&task->cpus_mask)); + seq_printf(m, "Cpus_allowed_list:\t%*pbl\n", +- cpumask_pr_args(task->cpus_ptr)); ++ cpumask_pr_args(&task->cpus_mask)); + } + + static inline void task_core_dumping(struct seq_file *m, struct mm_struct *mm) +diff --git a/fs/proc/base.c b/fs/proc/base.c +index 2ba1313aa..1497754fd 100644 +--- a/fs/proc/base.c ++++ b/fs/proc/base.c +@@ -97,6 +97,7 @@ + #include + #include + #include ++#include + #include + #include "internal.h" + #include "fd.h" +@@ -2145,7 +2146,7 @@ bool proc_fill_cache(struct file *file, struct dir_context *ctx, + + child = d_hash_and_lookup(dir, &qname); + if (!child) { +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + child = d_alloc_parallel(dir, &qname, &wq); + if (IS_ERR(child)) + goto end_instantiate; +diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c +index ffed75f83..15f837dc0 100644 +--- a/fs/proc/proc_sysctl.c ++++ b/fs/proc/proc_sysctl.c +@@ -683,7 +683,7 @@ static bool proc_sys_fill_cache(struct file *file, + + child = d_lookup(dir, &qname); + if (!child) { +- DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); ++ DECLARE_SWAIT_QUEUE_HEAD_ONSTACK(wq); + child = d_alloc_parallel(dir, &qname, &wq); + if (IS_ERR(child)) + return false; +diff --git a/fs/pstore/platform.c b/fs/pstore/platform.c +index b1ebf7b61..b7e3a6bac 100644 +--- a/fs/pstore/platform.c ++++ b/fs/pstore/platform.c +@@ -383,7 +383,8 @@ void pstore_record_init(struct pstore_record *record, + * end of the buffer. + */ + static void pstore_dump(struct kmsg_dumper *dumper, +- enum kmsg_dump_reason reason) ++ enum kmsg_dump_reason reason, ++ struct kmsg_dumper_iter *iter) + { + unsigned long total = 0; + const char *why; +@@ -435,7 +436,7 @@ static void pstore_dump(struct kmsg_dumper *dumper, + dst_size -= header_size; + + /* Write dump contents. */ +- if (!kmsg_dump_get_buffer(dumper, true, dst + header_size, ++ if (!kmsg_dump_get_buffer(iter, true, dst + header_size, + dst_size, &dump_size)) + break; + +diff --git a/include/asm-generic/Kbuild b/include/asm-generic/Kbuild +index d1300c6e0..267f6dfb8 100644 +--- a/include/asm-generic/Kbuild ++++ b/include/asm-generic/Kbuild +@@ -30,7 +30,7 @@ mandatory-y += irq.h + mandatory-y += irq_regs.h + mandatory-y += irq_work.h + mandatory-y += kdebug.h +-mandatory-y += kmap_types.h ++mandatory-y += kmap_size.h + mandatory-y += kprobes.h + mandatory-y += linkage.h + mandatory-y += local.h +diff --git a/include/asm-generic/hardirq.h b/include/asm-generic/hardirq.h +index d14214dfc..7317e8258 100644 +--- a/include/asm-generic/hardirq.h ++++ b/include/asm-generic/hardirq.h +@@ -7,9 +7,13 @@ + + typedef struct { + unsigned int __softirq_pending; ++#ifdef ARCH_WANTS_NMI_IRQSTAT ++ unsigned int __nmi_count; ++#endif + } ____cacheline_aligned irq_cpustat_t; + +-#include /* Standard mappings for irq_cpustat_t above */ ++DECLARE_PER_CPU_ALIGNED(irq_cpustat_t, irq_stat); ++ + #include + + #ifndef ack_bad_irq +diff --git a/include/asm-generic/kmap_size.h b/include/asm-generic/kmap_size.h +new file mode 100644 +index 000000000..9d6c7786a +--- /dev/null ++++ b/include/asm-generic/kmap_size.h +@@ -0,0 +1,12 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++#ifndef _ASM_GENERIC_KMAP_SIZE_H ++#define _ASM_GENERIC_KMAP_SIZE_H ++ ++/* For debug this provides guard pages between the maps */ ++#ifdef CONFIG_DEBUG_HIGHMEM ++# define KM_MAX_IDX 33 ++#else ++# define KM_MAX_IDX 16 ++#endif ++ ++#endif +diff --git a/include/asm-generic/kmap_types.h b/include/asm-generic/kmap_types.h +deleted file mode 100644 +index 9f95b7b63..000000000 +--- a/include/asm-generic/kmap_types.h ++++ /dev/null +@@ -1,11 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0 */ +-#ifndef _ASM_GENERIC_KMAP_TYPES_H +-#define _ASM_GENERIC_KMAP_TYPES_H +- +-#ifdef __WITH_KM_FENCE +-# define KM_TYPE_NR 41 +-#else +-# define KM_TYPE_NR 20 +-#endif +- +-#endif +diff --git a/include/asm-generic/preempt.h b/include/asm-generic/preempt.h +index b4d43a4af..ac255e889 100644 +--- a/include/asm-generic/preempt.h ++++ b/include/asm-generic/preempt.h +@@ -79,6 +79,9 @@ static __always_inline bool should_resched(int preempt_offset) + } + + #ifdef CONFIG_PREEMPTION ++#ifdef CONFIG_PREEMPT_RT ++extern void preempt_schedule_lock(void); ++#endif + extern asmlinkage void preempt_schedule(void); + #define __preempt_schedule() preempt_schedule() + extern asmlinkage void preempt_schedule_notrace(void); +diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h +index 23dfe7608..88e65db55 100644 +--- a/include/linux/blkdev.h ++++ b/include/linux/blkdev.h +@@ -162,7 +162,7 @@ struct request { + */ + union { + struct hlist_node hash; /* merge hash */ +- struct list_head ipi_list; ++ struct llist_node ipi_list; + }; + + /* +diff --git a/include/linux/bottom_half.h b/include/linux/bottom_half.h +index a19519f42..eed86eb0a 100644 +--- a/include/linux/bottom_half.h ++++ b/include/linux/bottom_half.h +@@ -4,7 +4,7 @@ + + #include + +-#ifdef CONFIG_TRACE_IRQFLAGS ++#if defined(CONFIG_PREEMPT_RT) || defined(CONFIG_TRACE_IRQFLAGS) + extern void __local_bh_disable_ip(unsigned long ip, unsigned int cnt); + #else + static __always_inline void __local_bh_disable_ip(unsigned long ip, unsigned int cnt) +@@ -32,4 +32,10 @@ static inline void local_bh_enable(void) + __local_bh_enable_ip(_THIS_IP_, SOFTIRQ_DISABLE_OFFSET); + } + ++#ifdef CONFIG_PREEMPT_RT ++extern bool local_bh_blocked(void); ++#else ++static inline bool local_bh_blocked(void) { return false; } ++#endif ++ + #endif /* _LINUX_BH_H */ +diff --git a/include/linux/console.h b/include/linux/console.h +index bc2a749e6..027278792 100644 +--- a/include/linux/console.h ++++ b/include/linux/console.h +@@ -16,6 +16,7 @@ + + #include + #include ++#include + + struct vc_data; + struct console_font_op; +@@ -137,10 +138,12 @@ static inline int con_debug_leave(void) + #define CON_ANYTIME (16) /* Safe to call when cpu is offline */ + #define CON_BRL (32) /* Used for a braille device */ + #define CON_EXTENDED (64) /* Use the extended output format a la /dev/kmsg */ ++#define CON_HANDOVER (128) /* Device was previously a boot console. */ + + struct console { + char name[16]; + void (*write)(struct console *, const char *, unsigned); ++ void (*write_atomic)(struct console *co, const char *s, unsigned int count); + int (*read)(struct console *, char *, unsigned); + struct tty_driver *(*device)(struct console *, int *); + void (*unblank)(void); +@@ -150,6 +153,11 @@ struct console { + short flags; + short index; + int cflag; ++#ifdef CONFIG_PRINTK ++ char sync_buf[CONSOLE_LOG_MAX]; ++#endif ++ atomic64_t printk_seq; ++ struct task_struct *thread; + uint ispeed; + uint ospeed; + void *data; +@@ -232,4 +240,7 @@ extern void console_init(void); + void dummycon_register_output_notifier(struct notifier_block *nb); + void dummycon_unregister_output_notifier(struct notifier_block *nb); + ++extern void console_atomic_lock(unsigned int *flags); ++extern void console_atomic_unlock(unsigned int flags); ++ + #endif /* _LINUX_CONSOLE_H */ +diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h +index b98b9eb7d..c986a9543 100644 +--- a/include/linux/cpuhotplug.h ++++ b/include/linux/cpuhotplug.h +@@ -155,6 +155,7 @@ enum cpuhp_state { + CPUHP_AP_ONLINE, + CPUHP_TEARDOWN_CPU, + CPUHP_AP_ONLINE_IDLE, ++ CPUHP_AP_SCHED_WAIT_EMPTY, + CPUHP_AP_SMPBOOT_THREADS, + CPUHP_AP_X86_VDSO_VMA_ONLINE, + CPUHP_AP_IRQ_AFFINITY_ONLINE, +diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h +index 0159986ac..c53364c42 100644 +--- a/include/linux/cpumask.h ++++ b/include/linux/cpumask.h +@@ -199,6 +199,11 @@ static inline int cpumask_any_and_distribute(const struct cpumask *src1p, + return cpumask_next_and(-1, src1p, src2p); + } + ++static inline int cpumask_any_distribute(const struct cpumask *srcp) ++{ ++ return cpumask_first(srcp); ++} ++ + #define for_each_cpu(cpu, mask) \ + for ((cpu) = 0; (cpu) < 1; (cpu)++, (void)mask) + #define for_each_cpu_not(cpu, mask) \ +@@ -252,6 +257,7 @@ int __pure cpumask_any_but(const struct cpumask *mask, unsigned int cpu); + unsigned int cpumask_local_spread(unsigned int i, int node); + int cpumask_any_and_distribute(const struct cpumask *src1p, + const struct cpumask *src2p); ++int cpumask_any_distribute(const struct cpumask *srcp); + + /** + * for_each_cpu - iterate over every cpu in a mask +diff --git a/include/linux/dcache.h b/include/linux/dcache.h +index 4bb8b1759..c5821c04a 100644 +--- a/include/linux/dcache.h ++++ b/include/linux/dcache.h +@@ -108,7 +108,7 @@ struct dentry { + + union { + struct list_head d_lru; /* LRU list */ +- wait_queue_head_t *d_wait; /* in-lookup ones only */ ++ struct swait_queue_head *d_wait; /* in-lookup ones only */ + }; + struct list_head d_child; /* child of parent list */ + struct list_head d_subdirs; /* our children */ +@@ -251,7 +251,7 @@ extern void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op + extern struct dentry * d_alloc(struct dentry *, const struct qstr *); + extern struct dentry * d_alloc_anon(struct super_block *); + extern struct dentry * d_alloc_parallel(struct dentry *, const struct qstr *, +- wait_queue_head_t *); ++ struct swait_queue_head *); + extern struct dentry * d_splice_alias(struct inode *, struct dentry *); + extern struct dentry * d_add_ci(struct dentry *, struct inode *, struct qstr *); + extern struct dentry * d_exact_alias(struct dentry *, struct inode *); +diff --git a/include/linux/debug_locks.h b/include/linux/debug_locks.h +index edb5c186b..3f49e6516 100644 +--- a/include/linux/debug_locks.h ++++ b/include/linux/debug_locks.h +@@ -3,8 +3,7 @@ + #define __LINUX_DEBUG_LOCKING_H + + #include +-#include +-#include ++#include + + struct task_struct; + +diff --git a/include/linux/delay.h b/include/linux/delay.h +index e8607992c..cd24f34b4 100644 +--- a/include/linux/delay.h ++++ b/include/linux/delay.h +@@ -88,4 +88,10 @@ static inline void fsleep(unsigned long usecs) + msleep(DIV_ROUND_UP(usecs, 1000)); + } + ++#ifdef CONFIG_PREEMPT_RT ++extern void cpu_chill(void); ++#else ++# define cpu_chill() cpu_relax() ++#endif ++ + #endif /* defined(_LINUX_DELAY_H) */ +diff --git a/include/linux/entry-common.h b/include/linux/entry-common.h +index d8e1c798d..d2aca09f7 100644 +--- a/include/linux/entry-common.h ++++ b/include/linux/entry-common.h +@@ -70,7 +70,7 @@ + + #define EXIT_TO_USER_MODE_WORK \ + (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ +- _TIF_NEED_RESCHED | _TIF_PATCH_PENDING | \ ++ _TIF_NEED_RESCHED_MASK | _TIF_PATCH_PENDING | \ + ARCH_EXIT_TO_USER_MODE_WORK) + + /** +diff --git a/include/linux/eventfd.h b/include/linux/eventfd.h +index dc4fd8a66..836b4c021 100644 +--- a/include/linux/eventfd.h ++++ b/include/linux/eventfd.h +@@ -14,6 +14,7 @@ + #include + #include + #include ++#include + + /* + * CAREFUL: Check include/uapi/asm-generic/fcntl.h when defining +@@ -42,11 +43,9 @@ __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n); + int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, wait_queue_entry_t *wait, + __u64 *cnt); + +-DECLARE_PER_CPU(int, eventfd_wake_count); +- +-static inline bool eventfd_signal_count(void) ++static inline bool eventfd_signal_allowed(void) + { +- return this_cpu_read(eventfd_wake_count); ++ return !current->in_eventfd_signal; + } + + #else /* CONFIG_EVENTFD */ +@@ -77,9 +76,9 @@ static inline int eventfd_ctx_remove_wait_queue(struct eventfd_ctx *ctx, + return -ENOSYS; + } + +-static inline bool eventfd_signal_count(void) ++static inline bool eventfd_signal_allowed(void) + { +- return false; ++ return true; + } + + #endif +diff --git a/include/linux/fs.h b/include/linux/fs.h +index db6327477..9ce4c7baa 100644 +--- a/include/linux/fs.h ++++ b/include/linux/fs.h +@@ -712,7 +712,7 @@ struct inode { + struct block_device *i_bdev; + struct cdev *i_cdev; + char *i_link; +- unsigned i_dir_seq; ++ unsigned __i_dir_seq; + }; + + __u32 i_generation; +diff --git a/include/linux/hardirq.h b/include/linux/hardirq.h +index 754f67ac4..76878b357 100644 +--- a/include/linux/hardirq.h ++++ b/include/linux/hardirq.h +@@ -6,6 +6,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -32,9 +33,9 @@ static __always_inline void rcu_irq_enter_check_tick(void) + */ + #define __irq_enter() \ + do { \ +- account_irq_enter_time(current); \ + preempt_count_add(HARDIRQ_OFFSET); \ + lockdep_hardirq_enter(); \ ++ account_hardirq_enter(current); \ + } while (0) + + /* +@@ -62,8 +63,8 @@ void irq_enter_rcu(void); + */ + #define __irq_exit() \ + do { \ ++ account_hardirq_exit(current); \ + lockdep_hardirq_exit(); \ +- account_irq_exit_time(current); \ + preempt_count_sub(HARDIRQ_OFFSET); \ + } while (0) + +@@ -115,7 +116,6 @@ extern void rcu_nmi_exit(void); + do { \ + lockdep_off(); \ + arch_nmi_enter(); \ +- printk_nmi_enter(); \ + BUG_ON(in_nmi() == NMI_MASK); \ + __preempt_count_add(NMI_OFFSET + HARDIRQ_OFFSET); \ + } while (0) +@@ -134,7 +134,6 @@ extern void rcu_nmi_exit(void); + do { \ + BUG_ON(!in_nmi()); \ + __preempt_count_sub(NMI_OFFSET + HARDIRQ_OFFSET); \ +- printk_nmi_exit(); \ + arch_nmi_exit(); \ + lockdep_on(); \ + } while (0) +diff --git a/include/linux/highmem-internal.h b/include/linux/highmem-internal.h +new file mode 100644 +index 000000000..f9bc6acd3 +--- /dev/null ++++ b/include/linux/highmem-internal.h +@@ -0,0 +1,222 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++#ifndef _LINUX_HIGHMEM_INTERNAL_H ++#define _LINUX_HIGHMEM_INTERNAL_H ++ ++/* ++ * Outside of CONFIG_HIGHMEM to support X86 32bit iomap_atomic() cruft. ++ */ ++#ifdef CONFIG_KMAP_LOCAL ++void *__kmap_local_pfn_prot(unsigned long pfn, pgprot_t prot); ++void *__kmap_local_page_prot(struct page *page, pgprot_t prot); ++void kunmap_local_indexed(void *vaddr); ++void kmap_local_fork(struct task_struct *tsk); ++void __kmap_local_sched_out(void); ++void __kmap_local_sched_in(void); ++static inline void kmap_assert_nomap(void) ++{ ++ DEBUG_LOCKS_WARN_ON(current->kmap_ctrl.idx); ++} ++#else ++static inline void kmap_local_fork(struct task_struct *tsk) { } ++static inline void kmap_assert_nomap(void) { } ++#endif ++ ++#ifdef CONFIG_HIGHMEM ++#include ++ ++#ifndef ARCH_HAS_KMAP_FLUSH_TLB ++static inline void kmap_flush_tlb(unsigned long addr) { } ++#endif ++ ++#ifndef kmap_prot ++#define kmap_prot PAGE_KERNEL ++#endif ++ ++void *kmap_high(struct page *page); ++void kunmap_high(struct page *page); ++void __kmap_flush_unused(void); ++struct page *__kmap_to_page(void *addr); ++ ++static inline void *kmap(struct page *page) ++{ ++ void *addr; ++ ++ might_sleep(); ++ if (!PageHighMem(page)) ++ addr = page_address(page); ++ else ++ addr = kmap_high(page); ++ kmap_flush_tlb((unsigned long)addr); ++ return addr; ++} ++ ++static inline void kunmap(struct page *page) ++{ ++ might_sleep(); ++ if (!PageHighMem(page)) ++ return; ++ kunmap_high(page); ++} ++ ++static inline struct page *kmap_to_page(void *addr) ++{ ++ return __kmap_to_page(addr); ++} ++ ++static inline void kmap_flush_unused(void) ++{ ++ __kmap_flush_unused(); ++} ++ ++static inline void *kmap_local_page(struct page *page) ++{ ++ return __kmap_local_page_prot(page, kmap_prot); ++} ++ ++static inline void *kmap_local_page_prot(struct page *page, pgprot_t prot) ++{ ++ return __kmap_local_page_prot(page, prot); ++} ++ ++static inline void *kmap_local_pfn(unsigned long pfn) ++{ ++ return __kmap_local_pfn_prot(pfn, kmap_prot); ++} ++ ++static inline void __kunmap_local(void *vaddr) ++{ ++ kunmap_local_indexed(vaddr); ++} ++ ++static inline void *kmap_atomic(struct page *page) ++{ ++ if (IS_ENABLED(CONFIG_PREEMPT_RT)) ++ migrate_disable(); ++ else ++ preempt_disable(); ++ pagefault_disable(); ++ return __kmap_local_page_prot(page, kmap_prot); ++} ++ ++static inline void __kunmap_atomic(void *addr) ++{ ++ kunmap_local_indexed(addr); ++ pagefault_enable(); ++ if (IS_ENABLED(CONFIG_PREEMPT_RT)) ++ migrate_enable(); ++ else ++ preempt_enable(); ++} ++ ++unsigned int __nr_free_highpages(void); ++extern atomic_long_t _totalhigh_pages; ++ ++static inline unsigned int nr_free_highpages(void) ++{ ++ return __nr_free_highpages(); ++} ++ ++static inline unsigned long totalhigh_pages(void) ++{ ++ return (unsigned long)atomic_long_read(&_totalhigh_pages); ++} ++ ++static inline void totalhigh_pages_inc(void) ++{ ++ atomic_long_inc(&_totalhigh_pages); ++} ++ ++static inline void totalhigh_pages_add(long count) ++{ ++ atomic_long_add(count, &_totalhigh_pages); ++} ++ ++#else /* CONFIG_HIGHMEM */ ++ ++static inline struct page *kmap_to_page(void *addr) ++{ ++ return virt_to_page(addr); ++} ++ ++static inline void *kmap(struct page *page) ++{ ++ might_sleep(); ++ return page_address(page); ++} ++ ++static inline void kunmap_high(struct page *page) { } ++static inline void kmap_flush_unused(void) { } ++ ++static inline void kunmap(struct page *page) ++{ ++#ifdef ARCH_HAS_FLUSH_ON_KUNMAP ++ kunmap_flush_on_unmap(page_address(page)); ++#endif ++} ++ ++static inline void *kmap_local_page(struct page *page) ++{ ++ return page_address(page); ++} ++ ++static inline void *kmap_local_page_prot(struct page *page, pgprot_t prot) ++{ ++ return kmap_local_page(page); ++} ++ ++static inline void *kmap_local_pfn(unsigned long pfn) ++{ ++ return kmap_local_page(pfn_to_page(pfn)); ++} ++ ++static inline void __kunmap_local(void *addr) ++{ ++#ifdef ARCH_HAS_FLUSH_ON_KUNMAP ++ kunmap_flush_on_unmap(addr); ++#endif ++} ++ ++static inline void *kmap_atomic(struct page *page) ++{ ++ if (IS_ENABLED(CONFIG_PREEMPT_RT)) ++ migrate_disable(); ++ else ++ preempt_disable(); ++ pagefault_disable(); ++ return page_address(page); ++} ++ ++static inline void __kunmap_atomic(void *addr) ++{ ++#ifdef ARCH_HAS_FLUSH_ON_KUNMAP ++ kunmap_flush_on_unmap(addr); ++#endif ++ pagefault_enable(); ++ if (IS_ENABLED(CONFIG_PREEMPT_RT)) ++ migrate_enable(); ++ else ++ preempt_enable(); ++} ++ ++static inline unsigned int nr_free_highpages(void) { return 0; } ++static inline unsigned long totalhigh_pages(void) { return 0UL; } ++ ++#endif /* CONFIG_HIGHMEM */ ++ ++/* ++ * Prevent people trying to call kunmap_atomic() as if it were kunmap() ++ * kunmap_atomic() should get the return value of kmap_atomic, not the page. ++ */ ++#define kunmap_atomic(__addr) \ ++do { \ ++ BUILD_BUG_ON(__same_type((__addr), struct page *)); \ ++ __kunmap_atomic(__addr); \ ++} while (0) ++ ++#define kunmap_local(__addr) \ ++do { \ ++ BUILD_BUG_ON(__same_type((__addr), struct page *)); \ ++ __kunmap_local(__addr); \ ++} while (0) ++ ++#endif +diff --git a/include/linux/highmem.h b/include/linux/highmem.h +index 6b27af8fe..ec1edaf12 100644 +--- a/include/linux/highmem.h ++++ b/include/linux/highmem.h +@@ -11,217 +11,137 @@ + + #include + +-#ifndef ARCH_HAS_FLUSH_ANON_PAGE +-static inline void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr) +-{ +-} +-#endif +- +-#ifndef ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE +-static inline void flush_kernel_dcache_page(struct page *page) +-{ +-} +-static inline void flush_kernel_vmap_range(void *vaddr, int size) +-{ +-} +-static inline void invalidate_kernel_vmap_range(void *vaddr, int size) +-{ +-} +-#endif +- +-#include +- +-#ifdef CONFIG_HIGHMEM +-extern void *kmap_atomic_high_prot(struct page *page, pgprot_t prot); +-extern void kunmap_atomic_high(void *kvaddr); +-#include +- +-#ifndef ARCH_HAS_KMAP_FLUSH_TLB +-static inline void kmap_flush_tlb(unsigned long addr) { } +-#endif +- +-#ifndef kmap_prot +-#define kmap_prot PAGE_KERNEL +-#endif +- +-void *kmap_high(struct page *page); +-static inline void *kmap(struct page *page) +-{ +- void *addr; +- +- might_sleep(); +- if (!PageHighMem(page)) +- addr = page_address(page); +- else +- addr = kmap_high(page); +- kmap_flush_tlb((unsigned long)addr); +- return addr; +-} +- +-void kunmap_high(struct page *page); +- +-static inline void kunmap(struct page *page) +-{ +- might_sleep(); +- if (!PageHighMem(page)) +- return; +- kunmap_high(page); +-} ++#include "highmem-internal.h" + +-/* +- * kmap_atomic/kunmap_atomic is significantly faster than kmap/kunmap because +- * no global lock is needed and because the kmap code must perform a global TLB +- * invalidation when the kmap pool wraps. ++/** ++ * kmap - Map a page for long term usage ++ * @page: Pointer to the page to be mapped ++ * ++ * Returns: The virtual address of the mapping + * +- * However when holding an atomic kmap it is not legal to sleep, so atomic +- * kmaps are appropriate for short, tight code paths only. ++ * Can only be invoked from preemptible task context because on 32bit ++ * systems with CONFIG_HIGHMEM enabled this function might sleep. + * +- * The use of kmap_atomic/kunmap_atomic is discouraged - kmap/kunmap +- * gives a more generic (and caching) interface. But kmap_atomic can +- * be used in IRQ contexts, so in some (very limited) cases we need +- * it. ++ * For systems with CONFIG_HIGHMEM=n and for pages in the low memory area ++ * this returns the virtual address of the direct kernel mapping. ++ * ++ * The returned virtual address is globally visible and valid up to the ++ * point where it is unmapped via kunmap(). The pointer can be handed to ++ * other contexts. ++ * ++ * For highmem pages on 32bit systems this can be slow as the mapping space ++ * is limited and protected by a global lock. In case that there is no ++ * mapping slot available the function blocks until a slot is released via ++ * kunmap(). + */ +-static inline void *kmap_atomic_prot(struct page *page, pgprot_t prot) +-{ +- preempt_disable(); +- pagefault_disable(); +- if (!PageHighMem(page)) +- return page_address(page); +- return kmap_atomic_high_prot(page, prot); +-} +-#define kmap_atomic(page) kmap_atomic_prot(page, kmap_prot) ++static inline void *kmap(struct page *page); + +-/* declarations for linux/mm/highmem.c */ +-unsigned int nr_free_highpages(void); +-extern atomic_long_t _totalhigh_pages; +-static inline unsigned long totalhigh_pages(void) +-{ +- return (unsigned long)atomic_long_read(&_totalhigh_pages); +-} +- +-static inline void totalhigh_pages_inc(void) +-{ +- atomic_long_inc(&_totalhigh_pages); +-} +- +-static inline void totalhigh_pages_dec(void) +-{ +- atomic_long_dec(&_totalhigh_pages); +-} +- +-static inline void totalhigh_pages_add(long count) +-{ +- atomic_long_add(count, &_totalhigh_pages); +-} +- +-static inline void totalhigh_pages_set(long val) +-{ +- atomic_long_set(&_totalhigh_pages, val); +-} +- +-void kmap_flush_unused(void); +- +-struct page *kmap_to_page(void *addr); +- +-#else /* CONFIG_HIGHMEM */ ++/** ++ * kunmap - Unmap the virtual address mapped by kmap() ++ * @addr: Virtual address to be unmapped ++ * ++ * Counterpart to kmap(). A NOOP for CONFIG_HIGHMEM=n and for mappings of ++ * pages in the low memory area. ++ */ ++static inline void kunmap(struct page *page); + +-static inline unsigned int nr_free_highpages(void) { return 0; } ++/** ++ * kmap_to_page - Get the page for a kmap'ed address ++ * @addr: The address to look up ++ * ++ * Returns: The page which is mapped to @addr. ++ */ ++static inline struct page *kmap_to_page(void *addr); + +-static inline struct page *kmap_to_page(void *addr) +-{ +- return virt_to_page(addr); +-} ++/** ++ * kmap_flush_unused - Flush all unused kmap mappings in order to ++ * remove stray mappings ++ */ ++static inline void kmap_flush_unused(void); + +-static inline unsigned long totalhigh_pages(void) { return 0UL; } ++/** ++ * kmap_local_page - Map a page for temporary usage ++ * @page: Pointer to the page to be mapped ++ * ++ * Returns: The virtual address of the mapping ++ * ++ * Can be invoked from any context. ++ * ++ * Requires careful handling when nesting multiple mappings because the map ++ * management is stack based. The unmap has to be in the reverse order of ++ * the map operation: ++ * ++ * addr1 = kmap_local_page(page1); ++ * addr2 = kmap_local_page(page2); ++ * ... ++ * kunmap_local(addr2); ++ * kunmap_local(addr1); ++ * ++ * Unmapping addr1 before addr2 is invalid and causes malfunction. ++ * ++ * Contrary to kmap() mappings the mapping is only valid in the context of ++ * the caller and cannot be handed to other contexts. ++ * ++ * On CONFIG_HIGHMEM=n kernels and for low memory pages this returns the ++ * virtual address of the direct mapping. Only real highmem pages are ++ * temporarily mapped. ++ * ++ * While it is significantly faster than kmap() for the higmem case it ++ * comes with restrictions about the pointer validity. Only use when really ++ * necessary. ++ * ++ * On HIGHMEM enabled systems mapping a highmem page has the side effect of ++ * disabling migration in order to keep the virtual address stable across ++ * preemption. No caller of kmap_local_page() can rely on this side effect. ++ */ ++static inline void *kmap_local_page(struct page *page); + +-static inline void *kmap(struct page *page) +-{ +- might_sleep(); +- return page_address(page); +-} ++/** ++ * kmap_atomic - Atomically map a page for temporary usage - Deprecated! ++ * @page: Pointer to the page to be mapped ++ * ++ * Returns: The virtual address of the mapping ++ * ++ * Effectively a wrapper around kmap_local_page() which disables pagefaults ++ * and preemption. ++ * ++ * Do not use in new code. Use kmap_local_page() instead. ++ */ ++static inline void *kmap_atomic(struct page *page); + +-static inline void kunmap_high(struct page *page) +-{ +-} ++/** ++ * kunmap_atomic - Unmap the virtual address mapped by kmap_atomic() ++ * @addr: Virtual address to be unmapped ++ * ++ * Counterpart to kmap_atomic(). ++ * ++ * Effectively a wrapper around kunmap_local() which additionally undoes ++ * the side effects of kmap_atomic(), i.e. reenabling pagefaults and ++ * preemption. ++ */ + +-static inline void kunmap(struct page *page) +-{ +-#ifdef ARCH_HAS_FLUSH_ON_KUNMAP +- kunmap_flush_on_unmap(page_address(page)); +-#endif +-} ++/* Highmem related interfaces for management code */ ++static inline unsigned int nr_free_highpages(void); ++static inline unsigned long totalhigh_pages(void); + +-static inline void *kmap_atomic(struct page *page) ++#ifndef ARCH_HAS_FLUSH_ANON_PAGE ++static inline void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr) + { +- preempt_disable(); +- pagefault_disable(); +- return page_address(page); + } +-#define kmap_atomic_prot(page, prot) kmap_atomic(page) +- +-static inline void kunmap_atomic_high(void *addr) +-{ +- /* +- * Mostly nothing to do in the CONFIG_HIGHMEM=n case as kunmap_atomic() +- * handles re-enabling faults + preemption +- */ +-#ifdef ARCH_HAS_FLUSH_ON_KUNMAP +- kunmap_flush_on_unmap(addr); + #endif +-} +- +-#define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn)) +- +-#define kmap_flush_unused() do {} while(0) +- +-#endif /* CONFIG_HIGHMEM */ + +-#if defined(CONFIG_HIGHMEM) || defined(CONFIG_X86_32) +- +-DECLARE_PER_CPU(int, __kmap_atomic_idx); +- +-static inline int kmap_atomic_idx_push(void) ++#ifndef ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE ++static inline void flush_kernel_dcache_page(struct page *page) + { +- int idx = __this_cpu_inc_return(__kmap_atomic_idx) - 1; +- +-#ifdef CONFIG_DEBUG_HIGHMEM +- WARN_ON_ONCE(in_irq() && !irqs_disabled()); +- BUG_ON(idx >= KM_TYPE_NR); +-#endif +- return idx; + } +- +-static inline int kmap_atomic_idx(void) ++static inline void flush_kernel_vmap_range(void *vaddr, int size) + { +- return __this_cpu_read(__kmap_atomic_idx) - 1; + } +- +-static inline void kmap_atomic_idx_pop(void) ++static inline void invalidate_kernel_vmap_range(void *vaddr, int size) + { +-#ifdef CONFIG_DEBUG_HIGHMEM +- int idx = __this_cpu_dec_return(__kmap_atomic_idx); +- +- BUG_ON(idx < 0); +-#else +- __this_cpu_dec(__kmap_atomic_idx); +-#endif + } +- + #endif + +-/* +- * Prevent people trying to call kunmap_atomic() as if it were kunmap() +- * kunmap_atomic() should get the return value of kmap_atomic, not the page. +- */ +-#define kunmap_atomic(addr) \ +-do { \ +- BUILD_BUG_ON(__same_type((addr), struct page *)); \ +- kunmap_atomic_high(addr); \ +- pagefault_enable(); \ +- preempt_enable(); \ +-} while (0) +- +- + /* when CONFIG_HIGHMEM is not set these will be plain clear/copy_page */ + #ifndef clear_user_highpage + static inline void clear_user_highpage(struct page *page, unsigned long vaddr) +diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h +index 22240a8c3..fc162c252 100644 +--- a/include/linux/interrupt.h ++++ b/include/linux/interrupt.h +@@ -542,7 +542,7 @@ struct softirq_action + asmlinkage void do_softirq(void); + asmlinkage void __do_softirq(void); + +-#ifdef __ARCH_HAS_DO_SOFTIRQ ++#if defined(__ARCH_HAS_DO_SOFTIRQ) && !defined(CONFIG_PREEMPT_RT) + void do_softirq_own_stack(void); + #else + static inline void do_softirq_own_stack(void) +@@ -637,26 +637,21 @@ enum + TASKLET_STATE_RUN /* Tasklet is running (SMP only) */ + }; + +-#ifdef CONFIG_SMP ++#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT) + static inline int tasklet_trylock(struct tasklet_struct *t) + { + return !test_and_set_bit(TASKLET_STATE_RUN, &(t)->state); + } + +-static inline void tasklet_unlock(struct tasklet_struct *t) +-{ +- smp_mb__before_atomic(); +- clear_bit(TASKLET_STATE_RUN, &(t)->state); +-} ++void tasklet_unlock(struct tasklet_struct *t); ++void tasklet_unlock_wait(struct tasklet_struct *t); ++void tasklet_unlock_spin_wait(struct tasklet_struct *t); + +-static inline void tasklet_unlock_wait(struct tasklet_struct *t) +-{ +- while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); } +-} + #else +-#define tasklet_trylock(t) 1 +-#define tasklet_unlock_wait(t) do { } while (0) +-#define tasklet_unlock(t) do { } while (0) ++static inline int tasklet_trylock(struct tasklet_struct *t) { return 1; } ++static inline void tasklet_unlock(struct tasklet_struct *t) { } ++static inline void tasklet_unlock_wait(struct tasklet_struct *t) { } ++static inline void tasklet_unlock_spin_wait(struct tasklet_struct *t) { } + #endif + + extern void __tasklet_schedule(struct tasklet_struct *t); +@@ -681,6 +676,17 @@ static inline void tasklet_disable_nosync(struct tasklet_struct *t) + smp_mb__after_atomic(); + } + ++/* ++ * Do not use in new code. Disabling tasklets from atomic contexts is ++ * error prone and should be avoided. ++ */ ++static inline void tasklet_disable_in_atomic(struct tasklet_struct *t) ++{ ++ tasklet_disable_nosync(t); ++ tasklet_unlock_spin_wait(t); ++ smp_mb(); ++} ++ + static inline void tasklet_disable(struct tasklet_struct *t) + { + tasklet_disable_nosync(t); +diff --git a/include/linux/io-mapping.h b/include/linux/io-mapping.h +index c75e4d3d8..4bb8223f2 100644 +--- a/include/linux/io-mapping.h ++++ b/include/linux/io-mapping.h +@@ -60,22 +60,20 @@ io_mapping_fini(struct io_mapping *mapping) + iomap_free(mapping->base, mapping->size); + } + +-/* Atomic map/unmap */ ++/* Temporary mappings which are only valid in the current context */ + static inline void __iomem * +-io_mapping_map_atomic_wc(struct io_mapping *mapping, +- unsigned long offset) ++io_mapping_map_local_wc(struct io_mapping *mapping, unsigned long offset) + { + resource_size_t phys_addr; + + BUG_ON(offset >= mapping->size); + phys_addr = mapping->base + offset; +- return iomap_atomic_prot_pfn(PHYS_PFN(phys_addr), mapping->prot); ++ return __iomap_local_pfn_prot(PHYS_PFN(phys_addr), mapping->prot); + } + +-static inline void +-io_mapping_unmap_atomic(void __iomem *vaddr) ++static inline void io_mapping_unmap_local(void __iomem *vaddr) + { +- iounmap_atomic(vaddr); ++ kunmap_local_indexed((void __force *)vaddr); + } + + static inline void __iomem * +@@ -97,7 +95,7 @@ io_mapping_unmap(void __iomem *vaddr) + iounmap(vaddr); + } + +-#else ++#else /* HAVE_ATOMIC_IOMAP */ + + #include + +@@ -144,25 +142,19 @@ io_mapping_unmap(void __iomem *vaddr) + { + } + +-/* Atomic map/unmap */ ++/* Temporary mappings which are only valid in the current context */ + static inline void __iomem * +-io_mapping_map_atomic_wc(struct io_mapping *mapping, +- unsigned long offset) ++io_mapping_map_local_wc(struct io_mapping *mapping, unsigned long offset) + { +- preempt_disable(); +- pagefault_disable(); + return io_mapping_map_wc(mapping, offset, PAGE_SIZE); + } + +-static inline void +-io_mapping_unmap_atomic(void __iomem *vaddr) ++static inline void io_mapping_unmap_local(void __iomem *vaddr) + { + io_mapping_unmap(vaddr); +- pagefault_enable(); +- preempt_enable(); + } + +-#endif /* HAVE_ATOMIC_IOMAP */ ++#endif /* !HAVE_ATOMIC_IOMAP */ + + static inline struct io_mapping * + io_mapping_create_wc(resource_size_t base, +diff --git a/include/linux/irq_cpustat.h b/include/linux/irq_cpustat.h +deleted file mode 100644 +index 6e8895cd4..000000000 +--- a/include/linux/irq_cpustat.h ++++ /dev/null +@@ -1,28 +0,0 @@ +-/* SPDX-License-Identifier: GPL-2.0 */ +-#ifndef __irq_cpustat_h +-#define __irq_cpustat_h +- +-/* +- * Contains default mappings for irq_cpustat_t, used by almost every +- * architecture. Some arch (like s390) have per cpu hardware pages and +- * they define their own mappings for irq_stat. +- * +- * Keith Owens July 2000. +- */ +- +- +-/* +- * Simple wrappers reducing source bloat. Define all irq_stat fields +- * here, even ones that are arch dependent. That way we get common +- * definitions instead of differing sets for each arch. +- */ +- +-#ifndef __ARCH_IRQ_STAT +-DECLARE_PER_CPU_ALIGNED(irq_cpustat_t, irq_stat); /* defined in asm/hardirq.h */ +-#define __IRQ_STAT(cpu, member) (per_cpu(irq_stat.member, cpu)) +-#endif +- +-/* arch dependent irq_stat fields */ +-#define nmi_count(cpu) __IRQ_STAT((cpu), __nmi_count) /* i386 */ +- +-#endif /* __irq_cpustat_h */ +diff --git a/include/linux/irq_work.h b/include/linux/irq_work.h +index ec2a47a81..9448e2bfc 100644 +--- a/include/linux/irq_work.h ++++ b/include/linux/irq_work.h +@@ -3,6 +3,7 @@ + #define _LINUX_IRQ_WORK_H + + #include ++#include + + /* + * An entry can be in one of four states: +@@ -16,11 +17,13 @@ + struct irq_work { + struct __call_single_node node; + void (*func)(struct irq_work *); ++ struct rcuwait irqwait; + }; + + #define __IRQ_WORK_INIT(_func, _flags) (struct irq_work){ \ + .node = { .u_flags = (_flags), }, \ + .func = (_func), \ ++ .irqwait = __RCUWAIT_INITIALIZER(irqwait), \ + } + + #define IRQ_WORK_INIT(_func) __IRQ_WORK_INIT(_func, 0) +@@ -46,6 +49,11 @@ static inline bool irq_work_is_busy(struct irq_work *work) + return atomic_read(&work->node.a_flags) & IRQ_WORK_BUSY; + } + ++static inline bool irq_work_is_hard(struct irq_work *work) ++{ ++ return atomic_read(&work->node.a_flags) & IRQ_WORK_HARD_IRQ; ++} ++ + bool irq_work_queue(struct irq_work *work); + bool irq_work_queue_on(struct irq_work *work, int cpu); + +diff --git a/include/linux/irqdesc.h b/include/linux/irqdesc.h +index dc1b213ae..9bbcd8cba 100644 +--- a/include/linux/irqdesc.h ++++ b/include/linux/irqdesc.h +@@ -68,6 +68,7 @@ struct irq_desc { + unsigned int irqs_unhandled; + atomic_t threads_handled; + int threads_handled_last; ++ u64 random_ip; + raw_spinlock_t lock; + struct cpumask *percpu_enabled; + const struct cpumask *percpu_affinity; +diff --git a/include/linux/irqflags.h b/include/linux/irqflags.h +index fef2d43a7..741aa2008 100644 +--- a/include/linux/irqflags.h ++++ b/include/linux/irqflags.h +@@ -71,14 +71,6 @@ do { \ + do { \ + __this_cpu_dec(hardirq_context); \ + } while (0) +-# define lockdep_softirq_enter() \ +-do { \ +- current->softirq_context++; \ +-} while (0) +-# define lockdep_softirq_exit() \ +-do { \ +- current->softirq_context--; \ +-} while (0) + + # define lockdep_hrtimer_enter(__hrtimer) \ + ({ \ +@@ -140,6 +132,21 @@ do { \ + # define lockdep_irq_work_exit(__work) do { } while (0) + #endif + ++#if defined(CONFIG_TRACE_IRQFLAGS) && !defined(CONFIG_PREEMPT_RT) ++# define lockdep_softirq_enter() \ ++do { \ ++ current->softirq_context++; \ ++} while (0) ++# define lockdep_softirq_exit() \ ++do { \ ++ current->softirq_context--; \ ++} while (0) ++ ++#else ++# define lockdep_softirq_enter() do { } while (0) ++# define lockdep_softirq_exit() do { } while (0) ++#endif ++ + #if defined(CONFIG_IRQSOFF_TRACER) || \ + defined(CONFIG_PREEMPT_TRACER) + extern void stop_critical_timings(void); +diff --git a/include/linux/kernel.h b/include/linux/kernel.h +index 78a0907f0..e6270bfa6 100644 +--- a/include/linux/kernel.h ++++ b/include/linux/kernel.h +@@ -220,6 +220,7 @@ static __always_inline void might_resched(void) + extern void ___might_sleep(const char *file, int line, int preempt_offset); + extern void __might_sleep(const char *file, int line, int preempt_offset); + extern void __cant_sleep(const char *file, int line, int preempt_offset); ++extern void __cant_migrate(const char *file, int line); + + /** + * might_sleep - annotation for functions that can sleep +@@ -235,6 +236,10 @@ extern void __cant_sleep(const char *file, int line, int preempt_offset); + */ + # define might_sleep() \ + do { __might_sleep(__FILE__, __LINE__, 0); might_resched(); } while (0) ++ ++# define might_sleep_no_state_check() \ ++ do { ___might_sleep(__FILE__, __LINE__, 0); } while (0) ++ + /** + * cant_sleep - annotation for functions that cannot sleep + * +@@ -243,6 +248,18 @@ extern void __cant_sleep(const char *file, int line, int preempt_offset); + # define cant_sleep() \ + do { __cant_sleep(__FILE__, __LINE__, 0); } while (0) + # define sched_annotate_sleep() (current->task_state_change = 0) ++ ++/** ++ * cant_migrate - annotation for functions that cannot migrate ++ * ++ * Will print a stack trace if executed in code which is migratable ++ */ ++# define cant_migrate() \ ++ do { \ ++ if (IS_ENABLED(CONFIG_SMP)) \ ++ __cant_migrate(__FILE__, __LINE__); \ ++ } while (0) ++ + /** + * non_block_start - annotate the start of section where sleeping is prohibited + * +@@ -266,7 +283,9 @@ extern void __cant_sleep(const char *file, int line, int preempt_offset); + static inline void __might_sleep(const char *file, int line, + int preempt_offset) { } + # define might_sleep() do { might_resched(); } while (0) ++# define might_sleep_no_state_check() do { might_resched(); } while (0) + # define cant_sleep() do { } while (0) ++# define cant_migrate() do { } while (0) + # define sched_annotate_sleep() do { } while (0) + # define non_block_start() do { } while (0) + # define non_block_end() do { } while (0) +@@ -274,13 +293,6 @@ extern void __cant_sleep(const char *file, int line, int preempt_offset); + + #define might_sleep_if(cond) do { if (cond) might_sleep(); } while (0) + +-#ifndef CONFIG_PREEMPT_RT +-# define cant_migrate() cant_sleep() +-#else +- /* Placeholder for now */ +-# define cant_migrate() do { } while (0) +-#endif +- + /** + * abs - return absolute value of an argument + * @x: the value. If it is unsigned type, it is converted to signed type first. +diff --git a/include/linux/kmsg_dump.h b/include/linux/kmsg_dump.h +index 3378bcbe5..86673930c 100644 +--- a/include/linux/kmsg_dump.h ++++ b/include/linux/kmsg_dump.h +@@ -29,6 +29,18 @@ enum kmsg_dump_reason { + KMSG_DUMP_MAX + }; + ++/** ++ * struct kmsg_dumper_iter - iterator for kernel crash message dumper ++ * @active: Flag that specifies if this is currently dumping ++ * @cur_seq: Points to the oldest message to dump (private) ++ * @next_seq: Points after the newest message to dump (private) ++ */ ++struct kmsg_dumper_iter { ++ bool active; ++ u64 cur_seq; ++ u64 next_seq; ++}; ++ + /** + * struct kmsg_dumper - kernel crash message dumper structure + * @list: Entry in the dumper list (private) +@@ -39,33 +51,22 @@ enum kmsg_dump_reason { + */ + struct kmsg_dumper { + struct list_head list; +- void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason); ++ void (*dump)(struct kmsg_dumper *dumper, enum kmsg_dump_reason reason, ++ struct kmsg_dumper_iter *iter); + enum kmsg_dump_reason max_reason; +- bool active; + bool registered; +- +- /* private state of the kmsg iterator */ +- u32 cur_idx; +- u32 next_idx; +- u64 cur_seq; +- u64 next_seq; + }; + + #ifdef CONFIG_PRINTK + void kmsg_dump(enum kmsg_dump_reason reason); + +-bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, bool syslog, +- char *line, size_t size, size_t *len); +- +-bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog, ++bool kmsg_dump_get_line(struct kmsg_dumper_iter *iter, bool syslog, + char *line, size_t size, size_t *len); + +-bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, +- char *buf, size_t size, size_t *len); +- +-void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper); ++bool kmsg_dump_get_buffer(struct kmsg_dumper_iter *iter, bool syslog, ++ char *buf, size_t size, size_t *len_out); + +-void kmsg_dump_rewind(struct kmsg_dumper *dumper); ++void kmsg_dump_rewind(struct kmsg_dumper_iter *iter); + + int kmsg_dump_register(struct kmsg_dumper *dumper); + +@@ -77,30 +78,19 @@ static inline void kmsg_dump(enum kmsg_dump_reason reason) + { + } + +-static inline bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, +- bool syslog, const char *line, +- size_t size, size_t *len) +-{ +- return false; +-} +- +-static inline bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog, ++static inline bool kmsg_dump_get_line(struct kmsg_dumper_iter *iter, bool syslog, + const char *line, size_t size, size_t *len) + { + return false; + } + +-static inline bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, ++static inline bool kmsg_dump_get_buffer(struct kmsg_dumper_iter *iter, bool syslog, + char *buf, size_t size, size_t *len) + { + return false; + } + +-static inline void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper) +-{ +-} +- +-static inline void kmsg_dump_rewind(struct kmsg_dumper *dumper) ++static inline void kmsg_dump_rewind(struct kmsg_dumper_iter *iter) + { + } + +diff --git a/include/linux/local_lock_internal.h b/include/linux/local_lock_internal.h +index 3f02b8186..1b8ae0349 100644 +--- a/include/linux/local_lock_internal.h ++++ b/include/linux/local_lock_internal.h +@@ -7,13 +7,39 @@ + #include + + typedef struct { +-#ifdef CONFIG_DEBUG_LOCK_ALLOC ++#ifdef CONFIG_PREEMPT_RT ++ spinlock_t lock; ++ struct task_struct *owner; ++ int nestcnt; ++ ++#elif defined(CONFIG_DEBUG_LOCK_ALLOC) + struct lockdep_map dep_map; + struct task_struct *owner; + #endif + } local_lock_t; + +-#ifdef CONFIG_DEBUG_LOCK_ALLOC ++#ifdef CONFIG_PREEMPT_RT ++ ++#define INIT_LOCAL_LOCK(lockname) { \ ++ __SPIN_LOCK_UNLOCKED((lockname).lock), \ ++ .owner = NULL, \ ++ .nestcnt = 0, \ ++ } ++ ++static inline void ___local_lock_init(local_lock_t *l) ++{ ++ l->owner = NULL; ++ l->nestcnt = 0; ++} ++ ++#define __local_lock_init(l) \ ++do { \ ++ spin_lock_init(&(l)->lock); \ ++ ___local_lock_init(l); \ ++} while (0) ++ ++#elif defined(CONFIG_DEBUG_LOCK_ALLOC) ++ + # define LOCAL_LOCK_DEBUG_INIT(lockname) \ + .dep_map = { \ + .name = #lockname, \ +@@ -21,7 +47,33 @@ typedef struct { + .lock_type = LD_LOCK_PERCPU, \ + }, \ + .owner = NULL, ++#endif ++ ++#ifdef CONFIG_PREEMPT_RT + ++static inline void local_lock_acquire(local_lock_t *l) ++{ ++ if (l->owner != current) { ++ spin_lock(&l->lock); ++ DEBUG_LOCKS_WARN_ON(l->owner); ++ DEBUG_LOCKS_WARN_ON(l->nestcnt); ++ l->owner = current; ++ } ++ l->nestcnt++; ++} ++ ++static inline void local_lock_release(local_lock_t *l) ++{ ++ DEBUG_LOCKS_WARN_ON(l->nestcnt == 0); ++ DEBUG_LOCKS_WARN_ON(l->owner != current); ++ if (--l->nestcnt) ++ return; ++ ++ l->owner = NULL; ++ spin_unlock(&l->lock); ++} ++ ++#elif defined(CONFIG_DEBUG_LOCK_ALLOC) + static inline void local_lock_acquire(local_lock_t *l) + { + lock_map_acquire(&l->dep_map); +@@ -47,6 +99,47 @@ static inline void local_lock_release(local_lock_t *l) { } + static inline void local_lock_debug_init(local_lock_t *l) { } + #endif /* !CONFIG_DEBUG_LOCK_ALLOC */ + ++#ifdef CONFIG_PREEMPT_RT ++ ++#define __local_lock(lock) \ ++ do { \ ++ migrate_disable(); \ ++ local_lock_acquire(this_cpu_ptr(lock)); \ ++ } while (0) ++ ++#define __local_unlock(lock) \ ++ do { \ ++ local_lock_release(this_cpu_ptr(lock)); \ ++ migrate_enable(); \ ++ } while (0) ++ ++#define __local_lock_irq(lock) \ ++ do { \ ++ migrate_disable(); \ ++ local_lock_acquire(this_cpu_ptr(lock)); \ ++ } while (0) ++ ++#define __local_lock_irqsave(lock, flags) \ ++ do { \ ++ migrate_disable(); \ ++ flags = 0; \ ++ local_lock_acquire(this_cpu_ptr(lock)); \ ++ } while (0) ++ ++#define __local_unlock_irq(lock) \ ++ do { \ ++ local_lock_release(this_cpu_ptr(lock)); \ ++ migrate_enable(); \ ++ } while (0) ++ ++#define __local_unlock_irqrestore(lock, flags) \ ++ do { \ ++ local_lock_release(this_cpu_ptr(lock)); \ ++ migrate_enable(); \ ++ } while (0) ++ ++#else ++ + #define INIT_LOCAL_LOCK(lockname) { LOCAL_LOCK_DEBUG_INIT(lockname) } + + #define __local_lock_init(lock) \ +@@ -66,6 +159,12 @@ do { \ + local_lock_acquire(this_cpu_ptr(lock)); \ + } while (0) + ++#define __local_unlock(lock) \ ++ do { \ ++ local_lock_release(this_cpu_ptr(lock)); \ ++ preempt_enable(); \ ++ } while (0) ++ + #define __local_lock_irq(lock) \ + do { \ + local_irq_disable(); \ +@@ -78,12 +177,6 @@ do { \ + local_lock_acquire(this_cpu_ptr(lock)); \ + } while (0) + +-#define __local_unlock(lock) \ +- do { \ +- local_lock_release(this_cpu_ptr(lock)); \ +- preempt_enable(); \ +- } while (0) +- + #define __local_unlock_irq(lock) \ + do { \ + local_lock_release(this_cpu_ptr(lock)); \ +@@ -95,3 +188,5 @@ do { \ + local_lock_release(this_cpu_ptr(lock)); \ + local_irq_restore(flags); \ + } while (0) ++ ++#endif +diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h +index 1c22e294f..41aed4e91 100644 +--- a/include/linux/mm_types.h ++++ b/include/linux/mm_types.h +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -577,6 +578,9 @@ struct mm_struct { + bool tlb_flush_batched; + #endif + struct uprobes_state uprobes_state; ++#ifdef CONFIG_PREEMPT_RT ++ struct rcu_head delayed_drop; ++#endif + #ifdef CONFIG_HUGETLB_PAGE + atomic_long_t hugetlb_usage; + #endif +diff --git a/include/linux/mutex.h b/include/linux/mutex.h +index 4d671fba3..90923d300 100644 +--- a/include/linux/mutex.h ++++ b/include/linux/mutex.h +@@ -22,6 +22,20 @@ + + struct ww_acquire_ctx; + ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \ ++ , .dep_map = { \ ++ .name = #lockname, \ ++ .wait_type_inner = LD_WAIT_SLEEP, \ ++ } ++#else ++# define __DEP_MAP_MUTEX_INITIALIZER(lockname) ++#endif ++ ++#ifdef CONFIG_PREEMPT_RT ++# include ++#else ++ + /* + * Simple, straightforward mutexes with strict semantics: + * +@@ -68,14 +82,6 @@ struct mutex { + struct ww_class; + struct ww_acquire_ctx; + +-struct ww_mutex { +- struct mutex base; +- struct ww_acquire_ctx *ctx; +-#ifdef CONFIG_DEBUG_MUTEXES +- struct ww_class *ww_class; +-#endif +-}; +- + /* + * This is the control structure for tasks blocked on mutex, + * which resides on the blocked task's kernel stack: +@@ -119,16 +125,6 @@ do { \ + __mutex_init((mutex), #mutex, &__key); \ + } while (0) + +-#ifdef CONFIG_DEBUG_LOCK_ALLOC +-# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \ +- , .dep_map = { \ +- .name = #lockname, \ +- .wait_type_inner = LD_WAIT_SLEEP, \ +- } +-#else +-# define __DEP_MAP_MUTEX_INITIALIZER(lockname) +-#endif +- + #define __MUTEX_INITIALIZER(lockname) \ + { .owner = ATOMIC_LONG_INIT(0) \ + , .wait_lock = __SPIN_LOCK_UNLOCKED(lockname.wait_lock) \ +@@ -224,4 +220,6 @@ enum mutex_trylock_recursive_enum { + extern /* __deprecated */ __must_check enum mutex_trylock_recursive_enum + mutex_trylock_recursive(struct mutex *lock); + ++#endif /* !PREEMPT_RT */ ++ + #endif /* __LINUX_MUTEX_H */ +diff --git a/include/linux/mutex_rt.h b/include/linux/mutex_rt.h +new file mode 100644 +index 000000000..f0b2e07cd +--- /dev/null ++++ b/include/linux/mutex_rt.h +@@ -0,0 +1,130 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++#ifndef __LINUX_MUTEX_RT_H ++#define __LINUX_MUTEX_RT_H ++ ++#ifndef __LINUX_MUTEX_H ++#error "Please include mutex.h" ++#endif ++ ++#include ++ ++/* FIXME: Just for __lockfunc */ ++#include ++ ++struct mutex { ++ struct rt_mutex lock; ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ struct lockdep_map dep_map; ++#endif ++}; ++ ++#define __MUTEX_INITIALIZER(mutexname) \ ++ { \ ++ .lock = __RT_MUTEX_INITIALIZER(mutexname.lock) \ ++ __DEP_MAP_MUTEX_INITIALIZER(mutexname) \ ++ } ++ ++#define DEFINE_MUTEX(mutexname) \ ++ struct mutex mutexname = __MUTEX_INITIALIZER(mutexname) ++ ++extern void __mutex_do_init(struct mutex *lock, const char *name, struct lock_class_key *key); ++extern void __lockfunc _mutex_lock(struct mutex *lock); ++extern void __lockfunc _mutex_lock_io_nested(struct mutex *lock, int subclass); ++extern int __lockfunc _mutex_lock_interruptible(struct mutex *lock); ++extern int __lockfunc _mutex_lock_killable(struct mutex *lock); ++extern void __lockfunc _mutex_lock_nested(struct mutex *lock, int subclass); ++extern void __lockfunc _mutex_lock_nest_lock(struct mutex *lock, struct lockdep_map *nest_lock); ++extern int __lockfunc _mutex_lock_interruptible_nested(struct mutex *lock, int subclass); ++extern int __lockfunc _mutex_lock_killable_nested(struct mutex *lock, int subclass); ++extern int __lockfunc _mutex_trylock(struct mutex *lock); ++extern void __lockfunc _mutex_unlock(struct mutex *lock); ++ ++#define mutex_is_locked(l) rt_mutex_is_locked(&(l)->lock) ++#define mutex_lock(l) _mutex_lock(l) ++#define mutex_lock_interruptible(l) _mutex_lock_interruptible(l) ++#define mutex_lock_killable(l) _mutex_lock_killable(l) ++#define mutex_trylock(l) _mutex_trylock(l) ++#define mutex_unlock(l) _mutex_unlock(l) ++#define mutex_lock_io(l) _mutex_lock_io_nested(l, 0); ++ ++#define __mutex_owner(l) ((l)->lock.owner) ++ ++#ifdef CONFIG_DEBUG_MUTEXES ++#define mutex_destroy(l) rt_mutex_destroy(&(l)->lock) ++#else ++static inline void mutex_destroy(struct mutex *lock) {} ++#endif ++ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++# define mutex_lock_nested(l, s) _mutex_lock_nested(l, s) ++# define mutex_lock_interruptible_nested(l, s) \ ++ _mutex_lock_interruptible_nested(l, s) ++# define mutex_lock_killable_nested(l, s) \ ++ _mutex_lock_killable_nested(l, s) ++# define mutex_lock_io_nested(l, s) _mutex_lock_io_nested(l, s) ++ ++# define mutex_lock_nest_lock(lock, nest_lock) \ ++do { \ ++ typecheck(struct lockdep_map *, &(nest_lock)->dep_map); \ ++ _mutex_lock_nest_lock(lock, &(nest_lock)->dep_map); \ ++} while (0) ++ ++#else ++# define mutex_lock_nested(l, s) _mutex_lock(l) ++# define mutex_lock_interruptible_nested(l, s) \ ++ _mutex_lock_interruptible(l) ++# define mutex_lock_killable_nested(l, s) \ ++ _mutex_lock_killable(l) ++# define mutex_lock_nest_lock(lock, nest_lock) mutex_lock(lock) ++# define mutex_lock_io_nested(l, s) _mutex_lock_io_nested(l, s) ++#endif ++ ++# define mutex_init(mutex) \ ++do { \ ++ static struct lock_class_key __key; \ ++ \ ++ rt_mutex_init(&(mutex)->lock); \ ++ __mutex_do_init((mutex), #mutex, &__key); \ ++} while (0) ++ ++# define __mutex_init(mutex, name, key) \ ++do { \ ++ rt_mutex_init(&(mutex)->lock); \ ++ __mutex_do_init((mutex), name, key); \ ++} while (0) ++ ++/** ++ * These values are chosen such that FAIL and SUCCESS match the ++ * values of the regular mutex_trylock(). ++ */ ++enum mutex_trylock_recursive_enum { ++ MUTEX_TRYLOCK_FAILED = 0, ++ MUTEX_TRYLOCK_SUCCESS = 1, ++ MUTEX_TRYLOCK_RECURSIVE, ++}; ++/** ++ * mutex_trylock_recursive - trylock variant that allows recursive locking ++ * @lock: mutex to be locked ++ * ++ * This function should not be used, _ever_. It is purely for hysterical GEM ++ * raisins, and once those are gone this will be removed. ++ * ++ * Returns: ++ * MUTEX_TRYLOCK_FAILED - trylock failed, ++ * MUTEX_TRYLOCK_SUCCESS - lock acquired, ++ * MUTEX_TRYLOCK_RECURSIVE - we already owned the lock. ++ */ ++int __rt_mutex_owner_current(struct rt_mutex *lock); ++ ++static inline /* __deprecated */ __must_check enum mutex_trylock_recursive_enum ++mutex_trylock_recursive(struct mutex *lock) ++{ ++ if (unlikely(__rt_mutex_owner_current(&lock->lock))) ++ return MUTEX_TRYLOCK_RECURSIVE; ++ ++ return mutex_trylock(lock); ++} ++ ++extern int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock); ++ ++#endif +diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h +index 5491ad5f4..cd9e5b3f1 100644 +--- a/include/linux/nfs_xdr.h ++++ b/include/linux/nfs_xdr.h +@@ -1675,7 +1675,7 @@ struct nfs_unlinkdata { + struct nfs_removeargs args; + struct nfs_removeres res; + struct dentry *dentry; +- wait_queue_head_t wq; ++ struct swait_queue_head wq; + const struct cred *cred; + struct nfs_fattr dir_attr; + long timeout; +diff --git a/include/linux/notifier.h b/include/linux/notifier.h +index 2fb373a5c..723bc2df6 100644 +--- a/include/linux/notifier.h ++++ b/include/linux/notifier.h +@@ -58,7 +58,7 @@ struct notifier_block { + }; + + struct atomic_notifier_head { +- spinlock_t lock; ++ raw_spinlock_t lock; + struct notifier_block __rcu *head; + }; + +@@ -78,7 +78,7 @@ struct srcu_notifier_head { + }; + + #define ATOMIC_INIT_NOTIFIER_HEAD(name) do { \ +- spin_lock_init(&(name)->lock); \ ++ raw_spin_lock_init(&(name)->lock); \ + (name)->head = NULL; \ + } while (0) + #define BLOCKING_INIT_NOTIFIER_HEAD(name) do { \ +@@ -95,7 +95,7 @@ extern void srcu_init_notifier_head(struct srcu_notifier_head *nh); + cleanup_srcu_struct(&(name)->srcu); + + #define ATOMIC_NOTIFIER_INIT(name) { \ +- .lock = __SPIN_LOCK_UNLOCKED(name.lock), \ ++ .lock = __RAW_SPIN_LOCK_UNLOCKED(name.lock), \ + .head = NULL } + #define BLOCKING_NOTIFIER_INIT(name) { \ + .rwsem = __RWSEM_INITIALIZER((name).rwsem), \ +diff --git a/include/linux/pid.h b/include/linux/pid.h +index 34afff2dc..514dd026c 100644 +--- a/include/linux/pid.h ++++ b/include/linux/pid.h +@@ -3,6 +3,7 @@ + #define _LINUX_PID_H + + #include ++#include + #include + #include + +diff --git a/include/linux/preempt.h b/include/linux/preempt.h +index 7d9c1c0e1..7b5b2ed55 100644 +--- a/include/linux/preempt.h ++++ b/include/linux/preempt.h +@@ -77,31 +77,37 @@ + /* preempt_count() and related functions, depends on PREEMPT_NEED_RESCHED */ + #include + ++#define nmi_count() (preempt_count() & NMI_MASK) + #define hardirq_count() (preempt_count() & HARDIRQ_MASK) +-#define softirq_count() (preempt_count() & SOFTIRQ_MASK) +-#define irq_count() (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK \ +- | NMI_MASK)) ++#ifdef CONFIG_PREEMPT_RT ++# define softirq_count() (current->softirq_disable_cnt & SOFTIRQ_MASK) ++#else ++# define softirq_count() (preempt_count() & SOFTIRQ_MASK) ++#endif ++#define irq_count() (nmi_count() | hardirq_count() | softirq_count()) + + /* +- * Are we doing bottom half or hardware interrupt processing? ++ * Macros to retrieve the current execution context: + * +- * in_irq() - We're in (hard) IRQ context ++ * in_nmi() - We're in NMI context ++ * in_hardirq() - We're in hard IRQ context ++ * in_serving_softirq() - We're in softirq context ++ * in_task() - We're in task context ++ */ ++#define in_nmi() (nmi_count()) ++#define in_hardirq() (hardirq_count()) ++#define in_serving_softirq() (softirq_count() & SOFTIRQ_OFFSET) ++#define in_task() (!(in_nmi() | in_hardirq() | in_serving_softirq())) ++ ++/* ++ * The following macros are deprecated and should not be used in new code: ++ * in_irq() - Obsolete version of in_hardirq() + * in_softirq() - We have BH disabled, or are processing softirqs + * in_interrupt() - We're in NMI,IRQ,SoftIRQ context or have BH disabled +- * in_serving_softirq() - We're in softirq context +- * in_nmi() - We're in NMI context +- * in_task() - We're in task context +- * +- * Note: due to the BH disabled confusion: in_softirq(),in_interrupt() really +- * should not be used in new code. + */ + #define in_irq() (hardirq_count()) + #define in_softirq() (softirq_count()) + #define in_interrupt() (irq_count()) +-#define in_serving_softirq() (softirq_count() & SOFTIRQ_OFFSET) +-#define in_nmi() (preempt_count() & NMI_MASK) +-#define in_task() (!(preempt_count() & \ +- (NMI_MASK | HARDIRQ_MASK | SOFTIRQ_OFFSET))) + + /* + * The preempt_count offset after preempt_disable(); +@@ -115,7 +121,11 @@ + /* + * The preempt_count offset after spin_lock() + */ ++#if !defined(CONFIG_PREEMPT_RT) + #define PREEMPT_LOCK_OFFSET PREEMPT_DISABLE_OFFSET ++#else ++#define PREEMPT_LOCK_OFFSET 0 ++#endif + + /* + * The preempt_count offset needed for things like: +@@ -164,6 +174,20 @@ extern void preempt_count_sub(int val); + #define preempt_count_inc() preempt_count_add(1) + #define preempt_count_dec() preempt_count_sub(1) + ++#ifdef CONFIG_PREEMPT_LAZY ++#define add_preempt_lazy_count(val) do { preempt_lazy_count() += (val); } while (0) ++#define sub_preempt_lazy_count(val) do { preempt_lazy_count() -= (val); } while (0) ++#define inc_preempt_lazy_count() add_preempt_lazy_count(1) ++#define dec_preempt_lazy_count() sub_preempt_lazy_count(1) ++#define preempt_lazy_count() (current_thread_info()->preempt_lazy_count) ++#else ++#define add_preempt_lazy_count(val) do { } while (0) ++#define sub_preempt_lazy_count(val) do { } while (0) ++#define inc_preempt_lazy_count() do { } while (0) ++#define dec_preempt_lazy_count() do { } while (0) ++#define preempt_lazy_count() (0) ++#endif ++ + #ifdef CONFIG_PREEMPT_COUNT + + #define preempt_disable() \ +@@ -172,13 +196,25 @@ do { \ + barrier(); \ + } while (0) + ++#define preempt_lazy_disable() \ ++do { \ ++ inc_preempt_lazy_count(); \ ++ barrier(); \ ++} while (0) ++ + #define sched_preempt_enable_no_resched() \ + do { \ + barrier(); \ + preempt_count_dec(); \ + } while (0) + +-#define preempt_enable_no_resched() sched_preempt_enable_no_resched() ++#ifndef CONFIG_PREEMPT_RT ++# define preempt_enable_no_resched() sched_preempt_enable_no_resched() ++# define preempt_check_resched_rt() barrier(); ++#else ++# define preempt_enable_no_resched() preempt_enable() ++# define preempt_check_resched_rt() preempt_check_resched() ++#endif + + #define preemptible() (preempt_count() == 0 && !irqs_disabled()) + +@@ -203,6 +239,18 @@ do { \ + __preempt_schedule(); \ + } while (0) + ++/* ++ * open code preempt_check_resched() because it is not exported to modules and ++ * used by local_unlock() or bpf_enable_instrumentation(). ++ */ ++#define preempt_lazy_enable() \ ++do { \ ++ dec_preempt_lazy_count(); \ ++ barrier(); \ ++ if (should_resched(0)) \ ++ __preempt_schedule(); \ ++} while (0) ++ + #else /* !CONFIG_PREEMPTION */ + #define preempt_enable() \ + do { \ +@@ -210,6 +258,12 @@ do { \ + preempt_count_dec(); \ + } while (0) + ++#define preempt_lazy_enable() \ ++do { \ ++ dec_preempt_lazy_count(); \ ++ barrier(); \ ++} while (0) ++ + #define preempt_enable_notrace() \ + do { \ + barrier(); \ +@@ -248,8 +302,12 @@ do { \ + #define preempt_disable_notrace() barrier() + #define preempt_enable_no_resched_notrace() barrier() + #define preempt_enable_notrace() barrier() ++#define preempt_check_resched_rt() barrier() + #define preemptible() 0 + ++#define preempt_lazy_disable() barrier() ++#define preempt_lazy_enable() barrier() ++ + #endif /* CONFIG_PREEMPT_COUNT */ + + #ifdef MODULE +@@ -268,10 +326,22 @@ do { \ + } while (0) + #define preempt_fold_need_resched() \ + do { \ +- if (tif_need_resched()) \ ++ if (tif_need_resched_now()) \ + set_preempt_need_resched(); \ + } while (0) + ++#ifdef CONFIG_PREEMPT_RT ++# define preempt_disable_rt() preempt_disable() ++# define preempt_enable_rt() preempt_enable() ++# define preempt_disable_nort() barrier() ++# define preempt_enable_nort() barrier() ++#else ++# define preempt_disable_rt() barrier() ++# define preempt_enable_rt() barrier() ++# define preempt_disable_nort() preempt_disable() ++# define preempt_enable_nort() preempt_enable() ++#endif ++ + #ifdef CONFIG_PREEMPT_NOTIFIERS + + struct preempt_notifier; +@@ -322,34 +392,78 @@ static inline void preempt_notifier_init(struct preempt_notifier *notifier, + + #endif + +-/** +- * migrate_disable - Prevent migration of the current task ++#ifdef CONFIG_SMP ++ ++/* ++ * Migrate-Disable and why it is undesired. + * +- * Maps to preempt_disable() which also disables preemption. Use +- * migrate_disable() to annotate that the intent is to prevent migration, +- * but not necessarily preemption. ++ * When a preempted task becomes elegible to run under the ideal model (IOW it ++ * becomes one of the M highest priority tasks), it might still have to wait ++ * for the preemptee's migrate_disable() section to complete. Thereby suffering ++ * a reduction in bandwidth in the exact duration of the migrate_disable() ++ * section. + * +- * Can be invoked nested like preempt_disable() and needs the corresponding +- * number of migrate_enable() invocations. +- */ +-static __always_inline void migrate_disable(void) +-{ +- preempt_disable(); +-} +- +-/** +- * migrate_enable - Allow migration of the current task ++ * Per this argument, the change from preempt_disable() to migrate_disable() ++ * gets us: ++ * ++ * - a higher priority tasks gains reduced wake-up latency; with preempt_disable() ++ * it would have had to wait for the lower priority task. ++ * ++ * - a lower priority tasks; which under preempt_disable() could've instantly ++ * migrated away when another CPU becomes available, is now constrained ++ * by the ability to push the higher priority task away, which might itself be ++ * in a migrate_disable() section, reducing it's available bandwidth. ++ * ++ * IOW it trades latency / moves the interference term, but it stays in the ++ * system, and as long as it remains unbounded, the system is not fully ++ * deterministic. + * +- * Counterpart to migrate_disable(). + * +- * As migrate_disable() can be invoked nested, only the outermost invocation +- * reenables migration. ++ * The reason we have it anyway. ++ * ++ * PREEMPT_RT breaks a number of assumptions traditionally held. By forcing a ++ * number of primitives into becoming preemptible, they would also allow ++ * migration. This turns out to break a bunch of per-cpu usage. To this end, ++ * all these primitives employ migirate_disable() to restore this implicit ++ * assumption. ++ * ++ * This is a 'temporary' work-around at best. The correct solution is getting ++ * rid of the above assumptions and reworking the code to employ explicit ++ * per-cpu locking or short preempt-disable regions. ++ * ++ * The end goal must be to get rid of migrate_disable(), alternatively we need ++ * a schedulability theory that does not depend on abritrary migration. ++ * ++ * ++ * Notes on the implementation. ++ * ++ * The implementation is particularly tricky since existing code patterns ++ * dictate neither migrate_disable() nor migrate_enable() is allowed to block. ++ * This means that it cannot use cpus_read_lock() to serialize against hotplug, ++ * nor can it easily migrate itself into a pending affinity mask change on ++ * migrate_enable(). ++ * ++ * ++ * Note: even non-work-conserving schedulers like semi-partitioned depends on ++ * migration, so migrate_disable() is not only a problem for ++ * work-conserving schedulers. + * +- * Currently mapped to preempt_enable(). + */ +-static __always_inline void migrate_enable(void) ++extern void migrate_disable(void); ++extern void migrate_enable(void); ++ ++#else ++ ++static inline void migrate_disable(void) + { +- preempt_enable(); ++ preempt_lazy_disable(); + } + ++static inline void migrate_enable(void) ++{ ++ preempt_lazy_enable(); ++} ++ ++#endif /* CONFIG_SMP */ ++ + #endif /* __LINUX_PREEMPT_H */ +diff --git a/include/linux/printk.h b/include/linux/printk.h +index 7d787f91d..9331b131b 100644 +--- a/include/linux/printk.h ++++ b/include/linux/printk.h +@@ -46,6 +46,12 @@ static inline const char *printk_skip_headers(const char *buffer) + + #define CONSOLE_EXT_LOG_MAX 8192 + ++/* ++ * The maximum size of a record formatted for console printing ++ * (i.e. with the prefix prepended to every line). ++ */ ++#define CONSOLE_LOG_MAX 4096 ++ + /* printk's without a loglevel use this.. */ + #define MESSAGE_LOGLEVEL_DEFAULT CONFIG_MESSAGE_LOGLEVEL_DEFAULT + +@@ -149,18 +155,6 @@ static inline __printf(1, 2) __cold + void early_printk(const char *s, ...) { } + #endif + +-#ifdef CONFIG_PRINTK_NMI +-extern void printk_nmi_enter(void); +-extern void printk_nmi_exit(void); +-extern void printk_nmi_direct_enter(void); +-extern void printk_nmi_direct_exit(void); +-#else +-static inline void printk_nmi_enter(void) { } +-static inline void printk_nmi_exit(void) { } +-static inline void printk_nmi_direct_enter(void) { } +-static inline void printk_nmi_direct_exit(void) { } +-#endif /* PRINTK_NMI */ +- + #ifdef CONFIG_PRINTK + extern void printk_safe_enter(void); + extern void printk_safe_exit(void); +@@ -247,8 +241,6 @@ __printf(1, 2) void dump_stack_set_arch_desc(const char *fmt, ...); + void dump_stack_print_info(const char *log_lvl); + void show_regs_print_info(const char *log_lvl); + extern asmlinkage void dump_stack(void) __cold; +-extern void printk_safe_flush(void); +-extern void printk_safe_flush_on_panic(void); + #if defined(CONFIG_X86) || defined(CONFIG_ARM64_PSEUDO_NMI) + extern void zap_locks(void); + #else +@@ -318,14 +310,6 @@ static inline void dump_stack(void) + { + } + +-static inline void printk_safe_flush(void) +-{ +-} +- +-static inline void printk_safe_flush_on_panic(void) +-{ +-} +- + static inline void zap_locks(void) + { + } +@@ -546,6 +530,8 @@ extern int kptr_restrict; + no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) + #endif + ++bool pr_flush(int timeout_ms, bool reset_on_progress); ++ + /* + * ratelimited messages with local ratelimit_state, + * no local ratelimit_state used in the !PRINTK case +diff --git a/include/linux/random.h b/include/linux/random.h +index f45b8be3e..0e41d0527 100644 +--- a/include/linux/random.h ++++ b/include/linux/random.h +@@ -35,7 +35,7 @@ static inline void add_latent_entropy(void) {} + + extern void add_input_randomness(unsigned int type, unsigned int code, + unsigned int value) __latent_entropy; +-extern void add_interrupt_randomness(int irq, int irq_flags) __latent_entropy; ++extern void add_interrupt_randomness(int irq, int irq_flags, __u64 ip) __latent_entropy; + + extern void get_random_bytes(void *buf, int nbytes); + extern int wait_for_random_bytes(void); +diff --git a/include/linux/rbtree.h b/include/linux/rbtree.h +index d7db17996..c33b0e16d 100644 +--- a/include/linux/rbtree.h ++++ b/include/linux/rbtree.h +@@ -19,19 +19,9 @@ + + #include + #include ++#include + #include + +-struct rb_node { +- unsigned long __rb_parent_color; +- struct rb_node *rb_right; +- struct rb_node *rb_left; +-} __attribute__((aligned(sizeof(long)))); +- /* The alignment might seem pointless, but allegedly CRIS needs it */ +- +-struct rb_root { +- struct rb_node *rb_node; +-}; +- + #define rb_parent(r) ((struct rb_node *)((r)->__rb_parent_color & ~3)) + + #define RB_ROOT (struct rb_root) { NULL, } +@@ -112,21 +102,6 @@ static inline void rb_link_node_rcu(struct rb_node *node, struct rb_node *parent + typeof(*pos), field); 1; }); \ + pos = n) + +-/* +- * Leftmost-cached rbtrees. +- * +- * We do not cache the rightmost node based on footprint +- * size vs number of potential users that could benefit +- * from O(1) rb_last(). Just not worth it, users that want +- * this feature can always implement the logic explicitly. +- * Furthermore, users that want to cache both pointers may +- * find it a bit asymmetric, but that's ok. +- */ +-struct rb_root_cached { +- struct rb_root rb_root; +- struct rb_node *rb_leftmost; +-}; +- + #define RB_ROOT_CACHED (struct rb_root_cached) { {NULL, }, NULL } + + /* Same as rb_first(), but O(1) */ +diff --git a/include/linux/rbtree_type.h b/include/linux/rbtree_type.h +new file mode 100644 +index 000000000..77a89dd2c +--- /dev/null ++++ b/include/linux/rbtree_type.h +@@ -0,0 +1,31 @@ ++/* SPDX-License-Identifier: GPL-2.0-or-later */ ++#ifndef _LINUX_RBTREE_TYPE_H ++#define _LINUX_RBTREE_TYPE_H ++ ++struct rb_node { ++ unsigned long __rb_parent_color; ++ struct rb_node *rb_right; ++ struct rb_node *rb_left; ++} __attribute__((aligned(sizeof(long)))); ++/* The alignment might seem pointless, but allegedly CRIS needs it */ ++ ++struct rb_root { ++ struct rb_node *rb_node; ++}; ++ ++/* ++ * Leftmost-cached rbtrees. ++ * ++ * We do not cache the rightmost node based on footprint ++ * size vs number of potential users that could benefit ++ * from O(1) rb_last(). Just not worth it, users that want ++ * this feature can always implement the logic explicitly. ++ * Furthermore, users that want to cache both pointers may ++ * find it a bit asymmetric, but that's ok. ++ */ ++struct rb_root_cached { ++ struct rb_root rb_root; ++ struct rb_node *rb_leftmost; ++}; ++ ++#endif +diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h +index 095b3b39b..1effcae06 100644 +--- a/include/linux/rcupdate.h ++++ b/include/linux/rcupdate.h +@@ -54,6 +54,11 @@ void __rcu_read_unlock(void); + * types of kernel builds, the rcu_read_lock() nesting depth is unknowable. + */ + #define rcu_preempt_depth() (current->rcu_read_lock_nesting) ++#ifndef CONFIG_PREEMPT_RT ++#define sched_rcu_preempt_depth() rcu_preempt_depth() ++#else ++static inline int sched_rcu_preempt_depth(void) { return 0; } ++#endif + + #else /* #ifdef CONFIG_PREEMPT_RCU */ + +@@ -79,6 +84,8 @@ static inline int rcu_preempt_depth(void) + return 0; + } + ++#define sched_rcu_preempt_depth() rcu_preempt_depth() ++ + #endif /* #else #ifdef CONFIG_PREEMPT_RCU */ + + /* Internal to kernel */ +@@ -329,7 +336,8 @@ static inline void rcu_preempt_sleep_check(void) { } + #define rcu_sleep_check() \ + do { \ + rcu_preempt_sleep_check(); \ +- RCU_LOCKDEP_WARN(lock_is_held(&rcu_bh_lock_map), \ ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) \ ++ RCU_LOCKDEP_WARN(lock_is_held(&rcu_bh_lock_map), \ + "Illegal context switch in RCU-bh read-side critical section"); \ + RCU_LOCKDEP_WARN(lock_is_held(&rcu_sched_lock_map), \ + "Illegal context switch in RCU-sched read-side critical section"); \ +diff --git a/include/linux/rtmutex.h b/include/linux/rtmutex.h +index 6fd615a0e..b02009f53 100644 +--- a/include/linux/rtmutex.h ++++ b/include/linux/rtmutex.h +@@ -14,11 +14,15 @@ + #define __LINUX_RT_MUTEX_H + + #include +-#include +-#include ++#include ++#include + + extern int max_lock_depth; /* for sysctl */ + ++#ifdef CONFIG_DEBUG_MUTEXES ++#include ++#endif ++ + /** + * The rt_mutex structure + * +@@ -31,12 +35,7 @@ struct rt_mutex { + raw_spinlock_t wait_lock; + struct rb_root_cached waiters; + struct task_struct *owner; +-#ifdef CONFIG_DEBUG_RT_MUTEXES + int save_state; +- const char *name, *file; +- int line; +- void *magic; +-#endif + #ifdef CONFIG_DEBUG_LOCK_ALLOC + struct lockdep_map dep_map; + #endif +@@ -49,6 +48,7 @@ struct hrtimer_sleeper; + extern int rt_mutex_debug_check_no_locks_freed(const void *from, + unsigned long len); + extern void rt_mutex_debug_check_no_locks_held(struct task_struct *task); ++ extern void rt_mutex_debug_task_free(struct task_struct *tsk); + #else + static inline int rt_mutex_debug_check_no_locks_freed(const void *from, + unsigned long len) +@@ -56,25 +56,15 @@ struct hrtimer_sleeper; + return 0; + } + # define rt_mutex_debug_check_no_locks_held(task) do { } while (0) ++# define rt_mutex_debug_task_free(t) do { } while (0) + #endif + +-#ifdef CONFIG_DEBUG_RT_MUTEXES +-# define __DEBUG_RT_MUTEX_INITIALIZER(mutexname) \ +- , .name = #mutexname, .file = __FILE__, .line = __LINE__ +- +-# define rt_mutex_init(mutex) \ ++#define rt_mutex_init(mutex) \ + do { \ + static struct lock_class_key __key; \ + __rt_mutex_init(mutex, __func__, &__key); \ + } while (0) + +- extern void rt_mutex_debug_task_free(struct task_struct *tsk); +-#else +-# define __DEBUG_RT_MUTEX_INITIALIZER(mutexname) +-# define rt_mutex_init(mutex) __rt_mutex_init(mutex, NULL, NULL) +-# define rt_mutex_debug_task_free(t) do { } while (0) +-#endif +- + #ifdef CONFIG_DEBUG_LOCK_ALLOC + #define __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname) \ + , .dep_map = { .name = #mutexname } +@@ -82,12 +72,19 @@ do { \ + #define __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname) + #endif + +-#define __RT_MUTEX_INITIALIZER(mutexname) \ +- { .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(mutexname.wait_lock) \ ++#define __RT_MUTEX_INITIALIZER_PLAIN(mutexname) \ ++ .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(mutexname.wait_lock) \ + , .waiters = RB_ROOT_CACHED \ + , .owner = NULL \ +- __DEBUG_RT_MUTEX_INITIALIZER(mutexname) \ +- __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname)} ++ __DEP_MAP_RT_MUTEX_INITIALIZER(mutexname) ++ ++#define __RT_MUTEX_INITIALIZER(mutexname) \ ++ { __RT_MUTEX_INITIALIZER_PLAIN(mutexname) \ ++ , .save_state = 0 } ++ ++#define __RT_MUTEX_INITIALIZER_SAVE_STATE(mutexname) \ ++ { __RT_MUTEX_INITIALIZER_PLAIN(mutexname) \ ++ , .save_state = 1 } + + #define DEFINE_RT_MUTEX(mutexname) \ + struct rt_mutex mutexname = __RT_MUTEX_INITIALIZER(mutexname) +@@ -115,9 +112,6 @@ extern void rt_mutex_lock(struct rt_mutex *lock); + #endif + + extern int rt_mutex_lock_interruptible(struct rt_mutex *lock); +-extern int rt_mutex_timed_lock(struct rt_mutex *lock, +- struct hrtimer_sleeper *timeout); +- + extern int rt_mutex_trylock(struct rt_mutex *lock); + + extern void rt_mutex_unlock(struct rt_mutex *lock); +diff --git a/include/linux/rwlock_rt.h b/include/linux/rwlock_rt.h +new file mode 100644 +index 000000000..aafdb0a68 +--- /dev/null ++++ b/include/linux/rwlock_rt.h +@@ -0,0 +1,109 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++#ifndef __LINUX_RWLOCK_RT_H ++#define __LINUX_RWLOCK_RT_H ++ ++#ifndef __LINUX_SPINLOCK_H ++#error Do not include directly. Use spinlock.h ++#endif ++ ++extern void __lockfunc rt_write_lock(rwlock_t *rwlock); ++extern void __lockfunc rt_read_lock(rwlock_t *rwlock); ++extern int __lockfunc rt_write_trylock(rwlock_t *rwlock); ++extern int __lockfunc rt_read_trylock(rwlock_t *rwlock); ++extern void __lockfunc rt_write_unlock(rwlock_t *rwlock); ++extern void __lockfunc rt_read_unlock(rwlock_t *rwlock); ++extern int __lockfunc rt_read_can_lock(rwlock_t *rwlock); ++extern int __lockfunc rt_write_can_lock(rwlock_t *rwlock); ++extern void __rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key); ++ ++#define read_can_lock(rwlock) rt_read_can_lock(rwlock) ++#define write_can_lock(rwlock) rt_write_can_lock(rwlock) ++ ++#define read_trylock(lock) __cond_lock(lock, rt_read_trylock(lock)) ++#define write_trylock(lock) __cond_lock(lock, rt_write_trylock(lock)) ++ ++static inline int __write_trylock_rt_irqsave(rwlock_t *lock, unsigned long *flags) ++{ ++ *flags = 0; ++ return rt_write_trylock(lock); ++} ++ ++#define write_trylock_irqsave(lock, flags) \ ++ __cond_lock(lock, __write_trylock_rt_irqsave(lock, &(flags))) ++ ++#define read_lock_irqsave(lock, flags) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ rt_read_lock(lock); \ ++ flags = 0; \ ++ } while (0) ++ ++#define write_lock_irqsave(lock, flags) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ rt_write_lock(lock); \ ++ flags = 0; \ ++ } while (0) ++ ++#define read_lock(lock) rt_read_lock(lock) ++ ++#define read_lock_bh(lock) \ ++ do { \ ++ local_bh_disable(); \ ++ rt_read_lock(lock); \ ++ } while (0) ++ ++#define read_lock_irq(lock) read_lock(lock) ++ ++#define write_lock(lock) rt_write_lock(lock) ++ ++#define write_lock_bh(lock) \ ++ do { \ ++ local_bh_disable(); \ ++ rt_write_lock(lock); \ ++ } while (0) ++ ++#define write_lock_irq(lock) write_lock(lock) ++ ++#define read_unlock(lock) rt_read_unlock(lock) ++ ++#define read_unlock_bh(lock) \ ++ do { \ ++ rt_read_unlock(lock); \ ++ local_bh_enable(); \ ++ } while (0) ++ ++#define read_unlock_irq(lock) read_unlock(lock) ++ ++#define write_unlock(lock) rt_write_unlock(lock) ++ ++#define write_unlock_bh(lock) \ ++ do { \ ++ rt_write_unlock(lock); \ ++ local_bh_enable(); \ ++ } while (0) ++ ++#define write_unlock_irq(lock) write_unlock(lock) ++ ++#define read_unlock_irqrestore(lock, flags) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ (void) flags; \ ++ rt_read_unlock(lock); \ ++ } while (0) ++ ++#define write_unlock_irqrestore(lock, flags) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ (void) flags; \ ++ rt_write_unlock(lock); \ ++ } while (0) ++ ++#define rwlock_init(rwl) \ ++do { \ ++ static struct lock_class_key __key; \ ++ \ ++ __rt_rwlock_init(rwl, #rwl, &__key); \ ++} while (0) ++ ++#endif +diff --git a/include/linux/rwlock_types.h b/include/linux/rwlock_types.h +index 3bd03e180..0ad226b5d 100644 +--- a/include/linux/rwlock_types.h ++++ b/include/linux/rwlock_types.h +@@ -1,6 +1,10 @@ + #ifndef __LINUX_RWLOCK_TYPES_H + #define __LINUX_RWLOCK_TYPES_H + ++#if !defined(__LINUX_SPINLOCK_TYPES_H) ++# error "Do not include directly, include spinlock_types.h" ++#endif ++ + /* + * include/linux/rwlock_types.h - generic rwlock type definitions + * and initializers +diff --git a/include/linux/rwlock_types_rt.h b/include/linux/rwlock_types_rt.h +new file mode 100644 +index 000000000..4762391d6 +--- /dev/null ++++ b/include/linux/rwlock_types_rt.h +@@ -0,0 +1,56 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++#ifndef __LINUX_RWLOCK_TYPES_RT_H ++#define __LINUX_RWLOCK_TYPES_RT_H ++ ++#ifndef __LINUX_SPINLOCK_TYPES_H ++#error "Do not include directly. Include spinlock_types.h instead" ++#endif ++ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++# define RW_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } ++#else ++# define RW_DEP_MAP_INIT(lockname) ++#endif ++ ++typedef struct rt_rw_lock rwlock_t; ++ ++#define __RW_LOCK_UNLOCKED(name) __RWLOCK_RT_INITIALIZER(name) ++ ++#define DEFINE_RWLOCK(name) \ ++ rwlock_t name = __RW_LOCK_UNLOCKED(name) ++ ++/* ++ * A reader biased implementation primarily for CPU pinning. ++ * ++ * Can be selected as general replacement for the single reader RT rwlock ++ * variant ++ */ ++struct rt_rw_lock { ++ struct rt_mutex rtmutex; ++ atomic_t readers; ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ struct lockdep_map dep_map; ++#endif ++}; ++ ++#define READER_BIAS (1U << 31) ++#define WRITER_BIAS (1U << 30) ++ ++#define __RWLOCK_RT_INITIALIZER(name) \ ++{ \ ++ .readers = ATOMIC_INIT(READER_BIAS), \ ++ .rtmutex = __RT_MUTEX_INITIALIZER_SAVE_STATE(name.rtmutex), \ ++ RW_DEP_MAP_INIT(name) \ ++} ++ ++void __rwlock_biased_rt_init(struct rt_rw_lock *lock, const char *name, ++ struct lock_class_key *key); ++ ++#define rwlock_biased_rt_init(rwlock) \ ++ do { \ ++ static struct lock_class_key __key; \ ++ \ ++ __rwlock_biased_rt_init((rwlock), #rwlock, &__key); \ ++ } while (0) ++ ++#endif +diff --git a/include/linux/rwsem-rt.h b/include/linux/rwsem-rt.h +new file mode 100644 +index 000000000..0ba8aae9a +--- /dev/null ++++ b/include/linux/rwsem-rt.h +@@ -0,0 +1,70 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++#ifndef _LINUX_RWSEM_RT_H ++#define _LINUX_RWSEM_RT_H ++ ++#ifndef _LINUX_RWSEM_H ++#error "Include rwsem.h" ++#endif ++ ++#include ++#include ++ ++#define READER_BIAS (1U << 31) ++#define WRITER_BIAS (1U << 30) ++ ++struct rw_semaphore { ++ atomic_t readers; ++ struct rt_mutex rtmutex; ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ struct lockdep_map dep_map; ++#endif ++}; ++ ++#define __RWSEM_INITIALIZER(name) \ ++{ \ ++ .readers = ATOMIC_INIT(READER_BIAS), \ ++ .rtmutex = __RT_MUTEX_INITIALIZER(name.rtmutex), \ ++ RW_DEP_MAP_INIT(name) \ ++} ++ ++#define DECLARE_RWSEM(lockname) \ ++ struct rw_semaphore lockname = __RWSEM_INITIALIZER(lockname) ++ ++extern void __rwsem_init(struct rw_semaphore *rwsem, const char *name, ++ struct lock_class_key *key); ++ ++#define __init_rwsem(sem, name, key) \ ++do { \ ++ rt_mutex_init(&(sem)->rtmutex); \ ++ __rwsem_init((sem), (name), (key)); \ ++} while (0) ++ ++#define init_rwsem(sem) \ ++do { \ ++ static struct lock_class_key __key; \ ++ \ ++ __init_rwsem((sem), #sem, &__key); \ ++} while (0) ++ ++static inline int rwsem_is_locked(struct rw_semaphore *sem) ++{ ++ return atomic_read(&sem->readers) != READER_BIAS; ++} ++ ++static inline int rwsem_is_contended(struct rw_semaphore *sem) ++{ ++ return atomic_read(&sem->readers) > 0; ++} ++ ++extern void __down_read(struct rw_semaphore *sem); ++extern int __down_read_interruptible(struct rw_semaphore *sem); ++extern int __down_read_killable(struct rw_semaphore *sem); ++extern int __down_read_trylock(struct rw_semaphore *sem); ++extern void __down_write(struct rw_semaphore *sem); ++extern int __must_check __down_write_killable(struct rw_semaphore *sem); ++extern int __down_write_trylock(struct rw_semaphore *sem); ++extern void __up_read(struct rw_semaphore *sem); ++extern void __up_write(struct rw_semaphore *sem); ++extern void __downgrade_write(struct rw_semaphore *sem); ++ ++#endif +diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h +index 4c715be48..9323af8a9 100644 +--- a/include/linux/rwsem.h ++++ b/include/linux/rwsem.h +@@ -16,6 +16,11 @@ + #include + #include + #include ++ ++#ifdef CONFIG_PREEMPT_RT ++#include ++#else /* PREEMPT_RT */ ++ + #ifdef CONFIG_RWSEM_SPIN_ON_OWNER + #include + #endif +@@ -119,6 +124,13 @@ static inline int rwsem_is_contended(struct rw_semaphore *sem) + return !list_empty(&sem->wait_list); + } + ++#endif /* !PREEMPT_RT */ ++ ++/* ++ * The functions below are the same for all rwsem implementations including ++ * the RT specific variant. ++ */ ++ + /* + * lock for reading + */ +diff --git a/include/linux/sched.h b/include/linux/sched.h +index edd236f98..fbe40baa3 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -36,6 +36,7 @@ + #include + #include + #include ++#include + + /* task_struct member predeclarations (sorted alphabetically): */ + struct audit_context; +@@ -114,12 +115,8 @@ struct io_uring_task; + __TASK_TRACED | EXIT_DEAD | EXIT_ZOMBIE | \ + TASK_PARKED) + +-#define task_is_traced(task) ((task->state & __TASK_TRACED) != 0) +- + #define task_is_stopped(task) ((task->state & __TASK_STOPPED) != 0) + +-#define task_is_stopped_or_traced(task) ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0) +- + #ifdef CONFIG_DEBUG_ATOMIC_SLEEP + + /* +@@ -143,6 +140,9 @@ struct io_uring_task; + smp_store_mb(current->state, (state_value)); \ + } while (0) + ++#define __set_current_state_no_track(state_value) \ ++ current->state = (state_value); ++ + #define set_special_state(state_value) \ + do { \ + unsigned long flags; /* may shadow */ \ +@@ -196,6 +196,9 @@ struct io_uring_task; + #define set_current_state(state_value) \ + smp_store_mb(current->state, (state_value)) + ++#define __set_current_state_no_track(state_value) \ ++ __set_current_state(state_value) ++ + /* + * set_special_state() should be used for those states when the blocking task + * can not use the regular condition based wait-loop. In that case we must +@@ -668,6 +671,13 @@ struct wake_q_node { + struct wake_q_node *next; + }; + ++struct kmap_ctrl { ++#ifdef CONFIG_KMAP_LOCAL ++ int idx; ++ pte_t pteval[KM_MAX_IDX]; ++#endif ++}; ++ + /** + * struct task_struct_resvd - KABI extension struct + */ +@@ -684,6 +694,8 @@ struct task_struct { + #endif + /* -1 unrunnable, 0 runnable, >0 stopped: */ + volatile long state; ++ /* saved state for "spinlock sleepers" */ ++ volatile long saved_state; + + /* + * This begins the randomizable portion of task_struct. Only +@@ -755,6 +767,11 @@ struct task_struct { + int nr_cpus_allowed; + const cpumask_t *cpus_ptr; + cpumask_t cpus_mask; ++ void *migration_pending; ++#ifdef CONFIG_SMP ++ unsigned short migration_disabled; ++#endif ++ unsigned short migration_flags; + + #ifdef CONFIG_PREEMPT_RCU + int rcu_read_lock_nesting; +@@ -860,6 +877,10 @@ struct task_struct { + /* Stalled due to lack of memory */ + unsigned in_memstall:1; + #endif ++#ifdef CONFIG_EVENTFD ++ /* Recursion prevention for eventfd_signal() */ ++ unsigned in_eventfd_signal:1; ++#endif + + unsigned long atomic_flags; /* Flags requiring atomic access. */ + +@@ -1001,11 +1022,16 @@ struct task_struct { + /* Signal handlers: */ + struct signal_struct *signal; + struct sighand_struct __rcu *sighand; ++ struct sigqueue *sigqueue_cache; + sigset_t blocked; + sigset_t real_blocked; + /* Restored if set_restore_sigmask() was used: */ + sigset_t saved_sigmask; + struct sigpending pending; ++#ifdef CONFIG_PREEMPT_RT ++ /* TODO: move me into ->restart_block ? */ ++ struct kernel_siginfo forced_info; ++#endif + unsigned long sas_ss_sp; + size_t sas_ss_size; + unsigned int sas_ss_flags; +@@ -1032,6 +1058,7 @@ struct task_struct { + raw_spinlock_t pi_lock; + + struct wake_q_node wake_q; ++ struct wake_q_node wake_q_sleeper; + + #ifdef CONFIG_RT_MUTEXES + /* PI waiters blocked on a rt_mutex held by this task: */ +@@ -1059,6 +1086,9 @@ struct task_struct { + int softirq_context; + int irq_config; + #endif ++#ifdef CONFIG_PREEMPT_RT ++ int softirq_disable_cnt; ++#endif + + #ifdef CONFIG_LOCKDEP + # define MAX_LOCK_DEPTH 48UL +@@ -1344,6 +1374,7 @@ struct task_struct { + unsigned int sequential_io; + unsigned int sequential_io_avg; + #endif ++ struct kmap_ctrl kmap_ctrl; + #ifdef CONFIG_DEBUG_ATOMIC_SLEEP + unsigned long task_state_change; + #endif +@@ -1809,6 +1840,7 @@ extern struct task_struct *find_get_task_by_vpid(pid_t nr); + + extern int wake_up_state(struct task_struct *tsk, unsigned int state); + extern int wake_up_process(struct task_struct *tsk); ++extern int wake_up_lock_sleeper(struct task_struct *tsk); + extern void wake_up_new_task(struct task_struct *tsk); + + #ifdef CONFIG_SMP +@@ -1899,6 +1931,89 @@ static inline int test_tsk_need_resched(struct task_struct *tsk) + return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED)); + } + ++#ifdef CONFIG_PREEMPT_LAZY ++static inline void set_tsk_need_resched_lazy(struct task_struct *tsk) ++{ ++ set_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY); ++} ++ ++static inline void clear_tsk_need_resched_lazy(struct task_struct *tsk) ++{ ++ clear_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY); ++} ++ ++static inline int test_tsk_need_resched_lazy(struct task_struct *tsk) ++{ ++ return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED_LAZY)); ++} ++ ++static inline int need_resched_lazy(void) ++{ ++ return test_thread_flag(TIF_NEED_RESCHED_LAZY); ++} ++ ++static inline int need_resched_now(void) ++{ ++ return test_thread_flag(TIF_NEED_RESCHED); ++} ++ ++#else ++static inline void clear_tsk_need_resched_lazy(struct task_struct *tsk) { } ++static inline int need_resched_lazy(void) { return 0; } ++ ++static inline int need_resched_now(void) ++{ ++ return test_thread_flag(TIF_NEED_RESCHED); ++} ++ ++#endif ++ ++ ++static inline bool __task_is_stopped_or_traced(struct task_struct *task) ++{ ++ if (task->state & (__TASK_STOPPED | __TASK_TRACED)) ++ return true; ++#ifdef CONFIG_PREEMPT_RT ++ if (task->saved_state & (__TASK_STOPPED | __TASK_TRACED)) ++ return true; ++#endif ++ return false; ++} ++ ++static inline bool task_is_stopped_or_traced(struct task_struct *task) ++{ ++ bool traced_stopped; ++ ++#ifdef CONFIG_PREEMPT_RT ++ unsigned long flags; ++ ++ raw_spin_lock_irqsave(&task->pi_lock, flags); ++ traced_stopped = __task_is_stopped_or_traced(task); ++ raw_spin_unlock_irqrestore(&task->pi_lock, flags); ++#else ++ traced_stopped = __task_is_stopped_or_traced(task); ++#endif ++ return traced_stopped; ++} ++ ++static inline bool task_is_traced(struct task_struct *task) ++{ ++ bool traced = false; ++ ++ if (task->state & __TASK_TRACED) ++ return true; ++#ifdef CONFIG_PREEMPT_RT ++ /* in case the task is sleeping on tasklist_lock */ ++ raw_spin_lock_irq(&task->pi_lock); ++ if (task->state & __TASK_TRACED) ++ traced = true; ++ else if (task->saved_state & __TASK_TRACED) ++ traced = true; ++ raw_spin_unlock_irq(&task->pi_lock); ++#endif ++ return traced; ++} ++ + /* + * cond_resched() and cond_resched_lock(): latency reduction via + * explicit rescheduling in places that are safe. The return +diff --git a/include/linux/sched/hotplug.h b/include/linux/sched/hotplug.h +index 9a62ffdd2..412cdaba3 100644 +--- a/include/linux/sched/hotplug.h ++++ b/include/linux/sched/hotplug.h +@@ -11,8 +11,10 @@ extern int sched_cpu_activate(unsigned int cpu); + extern int sched_cpu_deactivate(unsigned int cpu); + + #ifdef CONFIG_HOTPLUG_CPU ++extern int sched_cpu_wait_empty(unsigned int cpu); + extern int sched_cpu_dying(unsigned int cpu); + #else ++# define sched_cpu_wait_empty NULL + # define sched_cpu_dying NULL + #endif + +diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h +index dc1f4dcd9..9796cc213 100644 +--- a/include/linux/sched/mm.h ++++ b/include/linux/sched/mm.h +@@ -49,6 +49,17 @@ static inline void mmdrop(struct mm_struct *mm) + __mmdrop(mm); + } + ++#ifdef CONFIG_PREEMPT_RT ++extern void __mmdrop_delayed(struct rcu_head *rhp); ++static inline void mmdrop_delayed(struct mm_struct *mm) ++{ ++ if (atomic_dec_and_test(&mm->mm_count)) ++ call_rcu(&mm->delayed_drop, __mmdrop_delayed); ++} ++#else ++# define mmdrop_delayed(mm) mmdrop(mm) ++#endif ++ + /** + * mmget() - Pin the address space associated with a &struct mm_struct. + * @mm: The address space to pin. +diff --git a/include/linux/sched/rt.h b/include/linux/sched/rt.h +index e5af028c0..994c25640 100644 +--- a/include/linux/sched/rt.h ++++ b/include/linux/sched/rt.h +@@ -39,20 +39,12 @@ static inline struct task_struct *rt_mutex_get_top_task(struct task_struct *p) + } + extern void rt_mutex_setprio(struct task_struct *p, struct task_struct *pi_task); + extern void rt_mutex_adjust_pi(struct task_struct *p); +-static inline bool tsk_is_pi_blocked(struct task_struct *tsk) +-{ +- return tsk->pi_blocked_on != NULL; +-} + #else + static inline struct task_struct *rt_mutex_get_top_task(struct task_struct *task) + { + return NULL; + } + # define rt_mutex_adjust_pi(p) do { } while (0) +-static inline bool tsk_is_pi_blocked(struct task_struct *tsk) +-{ +- return false; +-} + #endif + + extern void normalize_rt_tasks(void); +diff --git a/include/linux/sched/wake_q.h b/include/linux/sched/wake_q.h +index 26a2013ac..6e2dff721 100644 +--- a/include/linux/sched/wake_q.h ++++ b/include/linux/sched/wake_q.h +@@ -58,6 +58,17 @@ static inline bool wake_q_empty(struct wake_q_head *head) + + extern void wake_q_add(struct wake_q_head *head, struct task_struct *task); + extern void wake_q_add_safe(struct wake_q_head *head, struct task_struct *task); +-extern void wake_up_q(struct wake_q_head *head); ++extern void wake_q_add_sleeper(struct wake_q_head *head, struct task_struct *task); ++extern void __wake_up_q(struct wake_q_head *head, bool sleeper); ++ ++static inline void wake_up_q(struct wake_q_head *head) ++{ ++ __wake_up_q(head, false); ++} ++ ++static inline void wake_up_q_sleeper(struct wake_q_head *head) ++{ ++ __wake_up_q(head, true); ++} + + #endif /* _LINUX_SCHED_WAKE_Q_H */ +diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h +index 2b70f736b..68d756373 100644 +--- a/include/linux/serial_8250.h ++++ b/include/linux/serial_8250.h +@@ -7,6 +7,7 @@ + #ifndef _LINUX_SERIAL_8250_H + #define _LINUX_SERIAL_8250_H + ++#include + #include + #include + #include +@@ -125,6 +126,8 @@ struct uart_8250_port { + #define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA + unsigned char msr_saved_flags; + ++ atomic_t console_printing; ++ + struct uart_8250_dma *dma; + const struct uart_8250_ops *ops; + +@@ -180,6 +183,8 @@ void serial8250_init_port(struct uart_8250_port *up); + void serial8250_set_defaults(struct uart_8250_port *up); + void serial8250_console_write(struct uart_8250_port *up, const char *s, + unsigned int count); ++void serial8250_console_write_atomic(struct uart_8250_port *up, const char *s, ++ unsigned int count); + int serial8250_console_setup(struct uart_port *port, char *options, bool probe); + int serial8250_console_exit(struct uart_port *port); + +diff --git a/include/linux/shmem_fs.h b/include/linux/shmem_fs.h +index a5a5d1d4d..0470d1582 100644 +--- a/include/linux/shmem_fs.h ++++ b/include/linux/shmem_fs.h +@@ -31,7 +31,7 @@ struct shmem_sb_info { + struct percpu_counter used_blocks; /* How many are allocated */ + unsigned long max_inodes; /* How many inodes are allowed */ + unsigned long free_inodes; /* How many are left for allocation */ +- spinlock_t stat_lock; /* Serialize shmem_sb_info changes */ ++ raw_spinlock_t stat_lock; /* Serialize shmem_sb_info changes */ + umode_t mode; /* Mount mode for root directory */ + unsigned char huge; /* Whether to try for hugepages */ + kuid_t uid; /* Mount uid for root directory */ +diff --git a/include/linux/signal.h b/include/linux/signal.h +index b256f9c65..ebf6c515a 100644 +--- a/include/linux/signal.h ++++ b/include/linux/signal.h +@@ -265,6 +265,7 @@ static inline void init_sigpending(struct sigpending *sig) + } + + extern void flush_sigqueue(struct sigpending *queue); ++extern void flush_task_sigqueue(struct task_struct *tsk); + + /* Test if 'sig' is valid signal. Use this instead of testing _NSIG directly */ + static inline int valid_signal(unsigned long sig) +diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h +index e5f61bdd4..ddcab976a 100644 +--- a/include/linux/skbuff.h ++++ b/include/linux/skbuff.h +@@ -298,6 +298,7 @@ struct sk_buff_head { + + __u32 qlen; + spinlock_t lock; ++ raw_spinlock_t raw_lock; + }; + + struct sk_buff; +@@ -1913,6 +1914,12 @@ static inline void skb_queue_head_init(struct sk_buff_head *list) + __skb_queue_head_init(list); + } + ++static inline void skb_queue_head_init_raw(struct sk_buff_head *list) ++{ ++ raw_spin_lock_init(&list->raw_lock); ++ __skb_queue_head_init(list); ++} ++ + static inline void skb_queue_head_init_class(struct sk_buff_head *list, + struct lock_class_key *class) + { +diff --git a/include/linux/smp.h b/include/linux/smp.h +index 84a0b4828..8348fa412 100644 +--- a/include/linux/smp.h ++++ b/include/linux/smp.h +@@ -260,6 +260,9 @@ static inline int get_boot_cpu_id(void) + #define get_cpu() ({ preempt_disable(); __smp_processor_id(); }) + #define put_cpu() preempt_enable() + ++#define get_cpu_light() ({ migrate_disable(); __smp_processor_id(); }) ++#define put_cpu_light() migrate_enable() ++ + /* + * Callback to arch code if there's nosmp or maxcpus=0 on the + * boot command line: +diff --git a/include/linux/spinlock.h b/include/linux/spinlock.h +index 79897841a..c3c70291b 100644 +--- a/include/linux/spinlock.h ++++ b/include/linux/spinlock.h +@@ -309,7 +309,11 @@ static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock) + }) + + /* Include rwlock functions */ +-#include ++#ifdef CONFIG_PREEMPT_RT ++# include ++#else ++# include ++#endif + + /* + * Pull the _spin_*()/_read_*()/_write_*() functions/declarations: +@@ -320,6 +324,10 @@ static inline void do_raw_spin_unlock(raw_spinlock_t *lock) __releases(lock) + # include + #endif + ++#ifdef CONFIG_PREEMPT_RT ++# include ++#else /* PREEMPT_RT */ ++ + /* + * Map the spin_lock functions to the raw variants for PREEMPT_RT=n + */ +@@ -454,6 +462,8 @@ static __always_inline int spin_is_contended(spinlock_t *lock) + + #define assert_spin_locked(lock) assert_raw_spin_locked(&(lock)->rlock) + ++#endif /* !PREEMPT_RT */ ++ + /* + * Pull the atomic_t declaration: + * (asm-mips/atomic.h needs above definitions) +diff --git a/include/linux/spinlock_api_smp.h b/include/linux/spinlock_api_smp.h +index 19a9be9d9..da38149f2 100644 +--- a/include/linux/spinlock_api_smp.h ++++ b/include/linux/spinlock_api_smp.h +@@ -187,6 +187,8 @@ static inline int __raw_spin_trylock_bh(raw_spinlock_t *lock) + return 0; + } + +-#include ++#ifndef CONFIG_PREEMPT_RT ++# include ++#endif + + #endif /* __LINUX_SPINLOCK_API_SMP_H */ +diff --git a/include/linux/spinlock_rt.h b/include/linux/spinlock_rt.h +new file mode 100644 +index 000000000..3085132ea +--- /dev/null ++++ b/include/linux/spinlock_rt.h +@@ -0,0 +1,155 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++#ifndef __LINUX_SPINLOCK_RT_H ++#define __LINUX_SPINLOCK_RT_H ++ ++#ifndef __LINUX_SPINLOCK_H ++#error Do not include directly. Use spinlock.h ++#endif ++ ++#include ++ ++extern void ++__rt_spin_lock_init(spinlock_t *lock, const char *name, struct lock_class_key *key); ++ ++#define spin_lock_init(slock) \ ++do { \ ++ static struct lock_class_key __key; \ ++ \ ++ rt_mutex_init(&(slock)->lock); \ ++ __rt_spin_lock_init(slock, #slock, &__key); \ ++} while (0) ++ ++extern void __lockfunc rt_spin_lock(spinlock_t *lock); ++extern void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass); ++extern void __lockfunc rt_spin_lock_nest_lock(spinlock_t *lock, struct lockdep_map *nest_lock); ++extern void __lockfunc rt_spin_unlock(spinlock_t *lock); ++extern void __lockfunc rt_spin_lock_unlock(spinlock_t *lock); ++extern int __lockfunc rt_spin_trylock_irqsave(spinlock_t *lock, unsigned long *flags); ++extern int __lockfunc rt_spin_trylock_bh(spinlock_t *lock); ++extern int __lockfunc rt_spin_trylock(spinlock_t *lock); ++extern int atomic_dec_and_spin_lock(atomic_t *atomic, spinlock_t *lock); ++ ++/* ++ * lockdep-less calls, for derived types like rwlock: ++ * (for trylock they can use rt_mutex_trylock() directly. ++ * Migrate disable handling must be done at the call site. ++ */ ++extern void __lockfunc __rt_spin_lock(struct rt_mutex *lock); ++extern void __lockfunc __rt_spin_trylock(struct rt_mutex *lock); ++extern void __lockfunc __rt_spin_unlock(struct rt_mutex *lock); ++ ++#define spin_lock(lock) rt_spin_lock(lock) ++ ++#define spin_lock_bh(lock) \ ++ do { \ ++ local_bh_disable(); \ ++ rt_spin_lock(lock); \ ++ } while (0) ++ ++#define spin_lock_irq(lock) spin_lock(lock) ++ ++#define spin_do_trylock(lock) __cond_lock(lock, rt_spin_trylock(lock)) ++ ++#define spin_trylock(lock) \ ++({ \ ++ int __locked; \ ++ __locked = spin_do_trylock(lock); \ ++ __locked; \ ++}) ++ ++#ifdef CONFIG_LOCKDEP ++# define spin_lock_nested(lock, subclass) \ ++ do { \ ++ rt_spin_lock_nested(lock, subclass); \ ++ } while (0) ++ ++#define spin_lock_bh_nested(lock, subclass) \ ++ do { \ ++ local_bh_disable(); \ ++ rt_spin_lock_nested(lock, subclass); \ ++ } while (0) ++ ++# define spin_lock_nest_lock(lock, subclass) \ ++ do { \ ++ typecheck(struct lockdep_map *, &(subclass)->dep_map); \ ++ rt_spin_lock_nest_lock(lock, &(subclass)->dep_map); \ ++ } while (0) ++ ++# define spin_lock_irqsave_nested(lock, flags, subclass) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ flags = 0; \ ++ rt_spin_lock_nested(lock, subclass); \ ++ } while (0) ++#else ++# define spin_lock_nested(lock, subclass) spin_lock(((void)(subclass), (lock))) ++# define spin_lock_nest_lock(lock, subclass) spin_lock(((void)(subclass), (lock))) ++# define spin_lock_bh_nested(lock, subclass) spin_lock_bh(((void)(subclass), (lock))) ++ ++# define spin_lock_irqsave_nested(lock, flags, subclass) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ flags = 0; \ ++ spin_lock(((void)(subclass), (lock))); \ ++ } while (0) ++#endif ++ ++#define spin_lock_irqsave(lock, flags) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ flags = 0; \ ++ spin_lock(lock); \ ++ } while (0) ++ ++#define spin_unlock(lock) rt_spin_unlock(lock) ++ ++#define spin_unlock_bh(lock) \ ++ do { \ ++ rt_spin_unlock(lock); \ ++ local_bh_enable(); \ ++ } while (0) ++ ++#define spin_unlock_irq(lock) spin_unlock(lock) ++ ++#define spin_unlock_irqrestore(lock, flags) \ ++ do { \ ++ typecheck(unsigned long, flags); \ ++ (void) flags; \ ++ spin_unlock(lock); \ ++ } while (0) ++ ++#define spin_trylock_bh(lock) __cond_lock(lock, rt_spin_trylock_bh(lock)) ++#define spin_trylock_irq(lock) spin_trylock(lock) ++ ++#define spin_trylock_irqsave(lock, flags) \ ++({ \ ++ int __locked; \ ++ \ ++ typecheck(unsigned long, flags); \ ++ flags = 0; \ ++ __locked = spin_trylock(lock); \ ++ __locked; \ ++}) ++ ++#ifdef CONFIG_GENERIC_LOCKBREAK ++# define spin_is_contended(lock) ((lock)->break_lock) ++#else ++# define spin_is_contended(lock) (((void)(lock), 0)) ++#endif ++ ++static inline int spin_can_lock(spinlock_t *lock) ++{ ++ return !rt_mutex_is_locked(&lock->lock); ++} ++ ++static inline int spin_is_locked(spinlock_t *lock) ++{ ++ return rt_mutex_is_locked(&lock->lock); ++} ++ ++static inline void assert_spin_locked(spinlock_t *lock) ++{ ++ BUG_ON(!spin_is_locked(lock)); ++} ++ ++#endif +diff --git a/include/linux/spinlock_types.h b/include/linux/spinlock_types.h +index b981caafe..8d896d3e1 100644 +--- a/include/linux/spinlock_types.h ++++ b/include/linux/spinlock_types.h +@@ -9,93 +9,15 @@ + * Released under the General Public License (GPL). + */ + +-#if defined(CONFIG_SMP) +-# include +-#else +-# include +-#endif +- +-#include +- +-typedef struct raw_spinlock { +- arch_spinlock_t raw_lock; +-#ifdef CONFIG_DEBUG_SPINLOCK +- unsigned int magic, owner_cpu; +- void *owner; +-#endif +-#ifdef CONFIG_DEBUG_LOCK_ALLOC +- struct lockdep_map dep_map; +-#endif +-} raw_spinlock_t; +- +-#define SPINLOCK_MAGIC 0xdead4ead +- +-#define SPINLOCK_OWNER_INIT ((void *)-1L) +- +-#ifdef CONFIG_DEBUG_LOCK_ALLOC +-# define RAW_SPIN_DEP_MAP_INIT(lockname) \ +- .dep_map = { \ +- .name = #lockname, \ +- .wait_type_inner = LD_WAIT_SPIN, \ +- } +-# define SPIN_DEP_MAP_INIT(lockname) \ +- .dep_map = { \ +- .name = #lockname, \ +- .wait_type_inner = LD_WAIT_CONFIG, \ +- } +-#else +-# define RAW_SPIN_DEP_MAP_INIT(lockname) +-# define SPIN_DEP_MAP_INIT(lockname) +-#endif ++#include + +-#ifdef CONFIG_DEBUG_SPINLOCK +-# define SPIN_DEBUG_INIT(lockname) \ +- .magic = SPINLOCK_MAGIC, \ +- .owner_cpu = -1, \ +- .owner = SPINLOCK_OWNER_INIT, ++#ifndef CONFIG_PREEMPT_RT ++# include ++# include + #else +-# define SPIN_DEBUG_INIT(lockname) ++# include ++# include ++# include + #endif + +-#define __RAW_SPIN_LOCK_INITIALIZER(lockname) \ +- { \ +- .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ +- SPIN_DEBUG_INIT(lockname) \ +- RAW_SPIN_DEP_MAP_INIT(lockname) } +- +-#define __RAW_SPIN_LOCK_UNLOCKED(lockname) \ +- (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname) +- +-#define DEFINE_RAW_SPINLOCK(x) raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x) +- +-typedef struct spinlock { +- union { +- struct raw_spinlock rlock; +- +-#ifdef CONFIG_DEBUG_LOCK_ALLOC +-# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map)) +- struct { +- u8 __padding[LOCK_PADSIZE]; +- struct lockdep_map dep_map; +- }; +-#endif +- }; +-} spinlock_t; +- +-#define ___SPIN_LOCK_INITIALIZER(lockname) \ +- { \ +- .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ +- SPIN_DEBUG_INIT(lockname) \ +- SPIN_DEP_MAP_INIT(lockname) } +- +-#define __SPIN_LOCK_INITIALIZER(lockname) \ +- { { .rlock = ___SPIN_LOCK_INITIALIZER(lockname) } } +- +-#define __SPIN_LOCK_UNLOCKED(lockname) \ +- (spinlock_t) __SPIN_LOCK_INITIALIZER(lockname) +- +-#define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) +- +-#include +- + #endif /* __LINUX_SPINLOCK_TYPES_H */ +diff --git a/include/linux/spinlock_types_nort.h b/include/linux/spinlock_types_nort.h +new file mode 100644 +index 000000000..e4549f0dd +--- /dev/null ++++ b/include/linux/spinlock_types_nort.h +@@ -0,0 +1,39 @@ ++#ifndef __LINUX_SPINLOCK_TYPES_NORT_H ++#define __LINUX_SPINLOCK_TYPES_NORT_H ++ ++#ifndef __LINUX_SPINLOCK_TYPES_H ++#error "Do not include directly. Include spinlock_types.h instead" ++#endif ++ ++/* ++ * The non RT version maps spinlocks to raw_spinlocks ++ */ ++typedef struct spinlock { ++ union { ++ struct raw_spinlock rlock; ++ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++# define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map)) ++ struct { ++ u8 __padding[LOCK_PADSIZE]; ++ struct lockdep_map dep_map; ++ }; ++#endif ++ }; ++} spinlock_t; ++ ++#define ___SPIN_LOCK_INITIALIZER(lockname) \ ++{ \ ++ .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ ++ SPIN_DEBUG_INIT(lockname) \ ++ SPIN_DEP_MAP_INIT(lockname) } ++ ++#define __SPIN_LOCK_INITIALIZER(lockname) \ ++ { { .rlock = ___SPIN_LOCK_INITIALIZER(lockname) } } ++ ++#define __SPIN_LOCK_UNLOCKED(lockname) \ ++ (spinlock_t) __SPIN_LOCK_INITIALIZER(lockname) ++ ++#define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x) ++ ++#endif +diff --git a/include/linux/spinlock_types_raw.h b/include/linux/spinlock_types_raw.h +new file mode 100644 +index 000000000..1d4a180e9 +--- /dev/null ++++ b/include/linux/spinlock_types_raw.h +@@ -0,0 +1,65 @@ ++#ifndef __LINUX_SPINLOCK_TYPES_RAW_H ++#define __LINUX_SPINLOCK_TYPES_RAW_H ++ ++#include ++ ++#if defined(CONFIG_SMP) ++# include ++#else ++# include ++#endif ++ ++#include ++ ++typedef struct raw_spinlock { ++ arch_spinlock_t raw_lock; ++#ifdef CONFIG_DEBUG_SPINLOCK ++ unsigned int magic, owner_cpu; ++ void *owner; ++#endif ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ struct lockdep_map dep_map; ++#endif ++} raw_spinlock_t; ++ ++#define SPINLOCK_MAGIC 0xdead4ead ++ ++#define SPINLOCK_OWNER_INIT ((void *)-1L) ++ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++# define RAW_SPIN_DEP_MAP_INIT(lockname) \ ++ .dep_map = { \ ++ .name = #lockname, \ ++ .wait_type_inner = LD_WAIT_SPIN, \ ++ } ++# define SPIN_DEP_MAP_INIT(lockname) \ ++ .dep_map = { \ ++ .name = #lockname, \ ++ .wait_type_inner = LD_WAIT_CONFIG, \ ++ } ++#else ++# define RAW_SPIN_DEP_MAP_INIT(lockname) ++# define SPIN_DEP_MAP_INIT(lockname) ++#endif ++ ++#ifdef CONFIG_DEBUG_SPINLOCK ++# define SPIN_DEBUG_INIT(lockname) \ ++ .magic = SPINLOCK_MAGIC, \ ++ .owner_cpu = -1, \ ++ .owner = SPINLOCK_OWNER_INIT, ++#else ++# define SPIN_DEBUG_INIT(lockname) ++#endif ++ ++#define __RAW_SPIN_LOCK_INITIALIZER(lockname) \ ++{ \ ++ .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \ ++ SPIN_DEBUG_INIT(lockname) \ ++ RAW_SPIN_DEP_MAP_INIT(lockname) } ++ ++#define __RAW_SPIN_LOCK_UNLOCKED(lockname) \ ++ (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname) ++ ++#define DEFINE_RAW_SPINLOCK(x) raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x) ++ ++#endif +diff --git a/include/linux/spinlock_types_rt.h b/include/linux/spinlock_types_rt.h +new file mode 100644 +index 000000000..446da786e +--- /dev/null ++++ b/include/linux/spinlock_types_rt.h +@@ -0,0 +1,38 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++#ifndef __LINUX_SPINLOCK_TYPES_RT_H ++#define __LINUX_SPINLOCK_TYPES_RT_H ++ ++#ifndef __LINUX_SPINLOCK_TYPES_H ++#error "Do not include directly. Include spinlock_types.h instead" ++#endif ++ ++#include ++ ++/* ++ * PREEMPT_RT: spinlocks - an RT mutex plus lock-break field: ++ */ ++typedef struct spinlock { ++ struct rt_mutex lock; ++ unsigned int break_lock; ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ struct lockdep_map dep_map; ++#endif ++} spinlock_t; ++ ++#define __RT_SPIN_INITIALIZER(name) \ ++ { \ ++ .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock), \ ++ .save_state = 1, \ ++ } ++/* ++.wait_list = PLIST_HEAD_INIT_RAW((name).lock.wait_list, (name).lock.wait_lock) ++*/ ++ ++#define __SPIN_LOCK_UNLOCKED(name) \ ++ { .lock = __RT_SPIN_INITIALIZER(name.lock), \ ++ SPIN_DEP_MAP_INIT(name) } ++ ++#define DEFINE_SPINLOCK(name) \ ++ spinlock_t name = __SPIN_LOCK_UNLOCKED(name) ++ ++#endif +diff --git a/include/linux/spinlock_types_up.h b/include/linux/spinlock_types_up.h +index c09b6407a..d9b371fa1 100644 +--- a/include/linux/spinlock_types_up.h ++++ b/include/linux/spinlock_types_up.h +@@ -1,7 +1,7 @@ + #ifndef __LINUX_SPINLOCK_TYPES_UP_H + #define __LINUX_SPINLOCK_TYPES_UP_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H ++#if !defined(__LINUX_SPINLOCK_TYPES_H) && !defined(__LINUX_RT_MUTEX_H) + # error "please don't include this file directly" + #endif + +diff --git a/include/linux/stop_machine.h b/include/linux/stop_machine.h +index 08ec8e2fd..06ad3ae7b 100644 +--- a/include/linux/stop_machine.h ++++ b/include/linux/stop_machine.h +@@ -25,6 +25,7 @@ typedef int (*cpu_stop_fn_t)(void *arg); + struct cpu_stop_work { + struct list_head list; /* cpu_stopper->works */ + cpu_stop_fn_t fn; ++ unsigned long caller; + void *arg; + struct cpu_stop_done *done; + KABI_RESERVE(1) +@@ -38,6 +39,8 @@ void stop_machine_park(int cpu); + void stop_machine_unpark(int cpu); + void stop_machine_yield(const struct cpumask *cpumask); + ++extern void print_stop_info(const char *log_lvl, struct task_struct *task); ++ + #else /* CONFIG_SMP */ + + #include +@@ -82,6 +85,8 @@ static inline bool stop_one_cpu_nowait(unsigned int cpu, + return false; + } + ++static inline void print_stop_info(const char *log_lvl, struct task_struct *task) { } ++ + #endif /* CONFIG_SMP */ + + /* +diff --git a/include/linux/thread_info.h b/include/linux/thread_info.h +index 19f76d87f..7c841bf0a 100644 +--- a/include/linux/thread_info.h ++++ b/include/linux/thread_info.h +@@ -36,7 +36,17 @@ static inline long set_restart_fn(struct restart_block *restart, + + #define THREADINFO_GFP (GFP_KERNEL_ACCOUNT | __GFP_ZERO) + +-#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) ++#ifdef CONFIG_PREEMPT_LAZY ++#define tif_need_resched() (test_thread_flag(TIF_NEED_RESCHED) || \ ++ test_thread_flag(TIF_NEED_RESCHED_LAZY)) ++#define tif_need_resched_now() (test_thread_flag(TIF_NEED_RESCHED)) ++#define tif_need_resched_lazy() test_thread_flag(TIF_NEED_RESCHED_LAZY)) ++ ++#else ++#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) ++#define tif_need_resched_now() test_thread_flag(TIF_NEED_RESCHED) ++#define tif_need_resched_lazy() 0 ++#endif + + #ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES + static inline int arch_within_stack_frames(const void * const stack, +diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h +index 409385b25..3b3c9de82 100644 +--- a/include/linux/trace_events.h ++++ b/include/linux/trace_events.h +@@ -67,6 +67,8 @@ struct trace_entry { + unsigned char flags; + unsigned char preempt_count; + int pid; ++ unsigned char migrate_disable; ++ unsigned char preempt_lazy_count; + }; + + #define TRACE_EVENT_TYPE_MAX \ +@@ -152,17 +154,66 @@ static inline void tracing_generic_entry_update(struct trace_entry *entry, + unsigned short type, + unsigned int trace_ctx) + { +- struct task_struct *tsk = current; +- + entry->preempt_count = trace_ctx & 0xff; +- entry->pid = (tsk) ? tsk->pid : 0; ++ entry->migrate_disable = (trace_ctx >> 8) & 0xff; ++ entry->preempt_lazy_count = (trace_ctx >> 16) & 0xff; ++ entry->pid = current->pid; + entry->type = type; +- entry->flags = trace_ctx >> 16; ++ entry->flags = trace_ctx >> 24; + } + +-unsigned int tracing_gen_ctx_flags(unsigned long irqflags); +-unsigned int tracing_gen_ctx(void); +-unsigned int tracing_gen_ctx_dec(void); ++unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status); ++ ++enum trace_flag_type { ++ TRACE_FLAG_IRQS_OFF = 0x01, ++ TRACE_FLAG_IRQS_NOSUPPORT = 0x02, ++ TRACE_FLAG_NEED_RESCHED = 0x04, ++ TRACE_FLAG_HARDIRQ = 0x08, ++ TRACE_FLAG_SOFTIRQ = 0x10, ++ TRACE_FLAG_PREEMPT_RESCHED = 0x20, ++ TRACE_FLAG_NMI = 0x40, ++ TRACE_FLAG_NEED_RESCHED_LAZY = 0x80, ++}; ++ ++#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT ++static inline unsigned int tracing_gen_ctx_flags(unsigned long irqflags) ++{ ++ unsigned int irq_status = irqs_disabled_flags(irqflags) ? ++ TRACE_FLAG_IRQS_OFF : 0; ++ return tracing_gen_ctx_irq_test(irq_status); ++} ++static inline unsigned int tracing_gen_ctx(void) ++{ ++ unsigned long irqflags; ++ ++ local_save_flags(irqflags); ++ return tracing_gen_ctx_flags(irqflags); ++} ++#else ++ ++static inline unsigned int tracing_gen_ctx_flags(unsigned long irqflags) ++{ ++ return tracing_gen_ctx_irq_test(TRACE_FLAG_IRQS_NOSUPPORT); ++} ++static inline unsigned int tracing_gen_ctx(void) ++{ ++ return tracing_gen_ctx_irq_test(TRACE_FLAG_IRQS_NOSUPPORT); ++} ++#endif ++ ++static inline unsigned int tracing_gen_ctx_dec(void) ++{ ++ unsigned int trace_ctx; ++ ++ trace_ctx = tracing_gen_ctx(); ++ /* ++ * Subtract one from the preeption counter if preemption is enabled, ++ * see trace_event_buffer_reserve()for details. ++ */ ++ if (IS_ENABLED(CONFIG_PREEMPTION)) ++ trace_ctx--; ++ return trace_ctx; ++} + + struct trace_event_file; + +diff --git a/include/linux/u64_stats_sync.h b/include/linux/u64_stats_sync.h +index e81856c0b..66eb968a0 100644 +--- a/include/linux/u64_stats_sync.h ++++ b/include/linux/u64_stats_sync.h +@@ -66,7 +66,7 @@ + #include + + struct u64_stats_sync { +-#if BITS_PER_LONG==32 && defined(CONFIG_SMP) ++#if BITS_PER_LONG==32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) + seqcount_t seq; + #endif + }; +@@ -115,7 +115,7 @@ static inline void u64_stats_inc(u64_stats_t *p) + } + #endif + +-#if BITS_PER_LONG == 32 && defined(CONFIG_SMP) ++#if BITS_PER_LONG == 32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) + #define u64_stats_init(syncp) seqcount_init(&(syncp)->seq) + #else + static inline void u64_stats_init(struct u64_stats_sync *syncp) +@@ -125,15 +125,19 @@ static inline void u64_stats_init(struct u64_stats_sync *syncp) + + static inline void u64_stats_update_begin(struct u64_stats_sync *syncp) + { +-#if BITS_PER_LONG==32 && defined(CONFIG_SMP) ++#if BITS_PER_LONG == 32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) ++ if (IS_ENABLED(CONFIG_PREEMPT_RT)) ++ preempt_disable(); + write_seqcount_begin(&syncp->seq); + #endif + } + + static inline void u64_stats_update_end(struct u64_stats_sync *syncp) + { +-#if BITS_PER_LONG==32 && defined(CONFIG_SMP) ++#if BITS_PER_LONG == 32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) + write_seqcount_end(&syncp->seq); ++ if (IS_ENABLED(CONFIG_PREEMPT_RT)) ++ preempt_enable(); + #endif + } + +@@ -142,8 +146,11 @@ u64_stats_update_begin_irqsave(struct u64_stats_sync *syncp) + { + unsigned long flags = 0; + +-#if BITS_PER_LONG==32 && defined(CONFIG_SMP) +- local_irq_save(flags); ++#if BITS_PER_LONG == 32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) ++ if (IS_ENABLED(CONFIG_PREEMPT_RT)) ++ preempt_disable(); ++ else ++ local_irq_save(flags); + write_seqcount_begin(&syncp->seq); + #endif + return flags; +@@ -153,15 +160,18 @@ static inline void + u64_stats_update_end_irqrestore(struct u64_stats_sync *syncp, + unsigned long flags) + { +-#if BITS_PER_LONG==32 && defined(CONFIG_SMP) ++#if BITS_PER_LONG == 32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) + write_seqcount_end(&syncp->seq); +- local_irq_restore(flags); ++ if (IS_ENABLED(CONFIG_PREEMPT_RT)) ++ preempt_enable(); ++ else ++ local_irq_restore(flags); + #endif + } + + static inline unsigned int __u64_stats_fetch_begin(const struct u64_stats_sync *syncp) + { +-#if BITS_PER_LONG==32 && defined(CONFIG_SMP) ++#if BITS_PER_LONG == 32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) + return read_seqcount_begin(&syncp->seq); + #else + return 0; +@@ -170,7 +180,7 @@ static inline unsigned int __u64_stats_fetch_begin(const struct u64_stats_sync * + + static inline unsigned int u64_stats_fetch_begin(const struct u64_stats_sync *syncp) + { +-#if BITS_PER_LONG==32 && !defined(CONFIG_SMP) ++#if BITS_PER_LONG == 32 && (!defined(CONFIG_SMP) && !defined(CONFIG_PREEMPT_RT)) + preempt_disable(); + #endif + return __u64_stats_fetch_begin(syncp); +@@ -179,7 +189,7 @@ static inline unsigned int u64_stats_fetch_begin(const struct u64_stats_sync *sy + static inline bool __u64_stats_fetch_retry(const struct u64_stats_sync *syncp, + unsigned int start) + { +-#if BITS_PER_LONG==32 && defined(CONFIG_SMP) ++#if BITS_PER_LONG == 32 && (defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT)) + return read_seqcount_retry(&syncp->seq, start); + #else + return false; +@@ -189,7 +199,7 @@ static inline bool __u64_stats_fetch_retry(const struct u64_stats_sync *syncp, + static inline bool u64_stats_fetch_retry(const struct u64_stats_sync *syncp, + unsigned int start) + { +-#if BITS_PER_LONG==32 && !defined(CONFIG_SMP) ++#if BITS_PER_LONG == 32 && (!defined(CONFIG_SMP) && !defined(CONFIG_PREEMPT_RT)) + preempt_enable(); + #endif + return __u64_stats_fetch_retry(syncp, start); +@@ -203,7 +213,9 @@ static inline bool u64_stats_fetch_retry(const struct u64_stats_sync *syncp, + */ + static inline unsigned int u64_stats_fetch_begin_irq(const struct u64_stats_sync *syncp) + { +-#if BITS_PER_LONG==32 && !defined(CONFIG_SMP) ++#if BITS_PER_LONG == 32 && defined(CONFIG_PREEMPT_RT) ++ preempt_disable(); ++#elif BITS_PER_LONG == 32 && !defined(CONFIG_SMP) + local_irq_disable(); + #endif + return __u64_stats_fetch_begin(syncp); +@@ -212,7 +224,9 @@ static inline unsigned int u64_stats_fetch_begin_irq(const struct u64_stats_sync + static inline bool u64_stats_fetch_retry_irq(const struct u64_stats_sync *syncp, + unsigned int start) + { +-#if BITS_PER_LONG==32 && !defined(CONFIG_SMP) ++#if BITS_PER_LONG == 32 && defined(CONFIG_PREEMPT_RT) ++ preempt_enable(); ++#elif BITS_PER_LONG == 32 && !defined(CONFIG_SMP) + local_irq_enable(); + #endif + return __u64_stats_fetch_retry(syncp, start); +diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h +index 322dcbfcc..9a3a10ea3 100644 +--- a/include/linux/vmstat.h ++++ b/include/linux/vmstat.h +@@ -63,7 +63,9 @@ DECLARE_PER_CPU(struct vm_event_state, vm_event_states); + */ + static inline void __count_vm_event(enum vm_event_item item) + { ++ preempt_disable_rt(); + raw_cpu_inc(vm_event_states.event[item]); ++ preempt_enable_rt(); + } + + static inline void count_vm_event(enum vm_event_item item) +@@ -73,7 +75,9 @@ static inline void count_vm_event(enum vm_event_item item) + + static inline void __count_vm_events(enum vm_event_item item, long delta) + { ++ preempt_disable_rt(); + raw_cpu_add(vm_event_states.event[item], delta); ++ preempt_enable_rt(); + } + + static inline void count_vm_events(enum vm_event_item item, long delta) +diff --git a/include/linux/vtime.h b/include/linux/vtime.h +index 2cdeca062..041d6524d 100644 +--- a/include/linux/vtime.h ++++ b/include/linux/vtime.h +@@ -83,36 +83,46 @@ static inline void vtime_init_idle(struct task_struct *tsk, int cpu) { } + #endif + + #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE +-extern void vtime_account_irq_enter(struct task_struct *tsk); +-static inline void vtime_account_irq_exit(struct task_struct *tsk) +-{ +- /* On hard|softirq exit we always account to hard|softirq cputime */ +- vtime_account_kernel(tsk); +-} ++extern void vtime_account_irq(struct task_struct *tsk, unsigned int offset); ++extern void vtime_account_softirq(struct task_struct *tsk); ++extern void vtime_account_hardirq(struct task_struct *tsk); + extern void vtime_flush(struct task_struct *tsk); + #else /* !CONFIG_VIRT_CPU_ACCOUNTING_NATIVE */ +-static inline void vtime_account_irq_enter(struct task_struct *tsk) { } +-static inline void vtime_account_irq_exit(struct task_struct *tsk) { } ++static inline void vtime_account_irq(struct task_struct *tsk, unsigned int offset) { } ++static inline void vtime_account_softirq(struct task_struct *tsk) { } ++static inline void vtime_account_hardirq(struct task_struct *tsk) { } + static inline void vtime_flush(struct task_struct *tsk) { } + #endif + + + #ifdef CONFIG_IRQ_TIME_ACCOUNTING +-extern void irqtime_account_irq(struct task_struct *tsk); ++extern void irqtime_account_irq(struct task_struct *tsk, unsigned int offset); + #else +-static inline void irqtime_account_irq(struct task_struct *tsk) { } ++static inline void irqtime_account_irq(struct task_struct *tsk, unsigned int offset) { } + #endif + +-static inline void account_irq_enter_time(struct task_struct *tsk) ++static inline void account_softirq_enter(struct task_struct *tsk) ++{ ++ vtime_account_irq(tsk, SOFTIRQ_OFFSET); ++ irqtime_account_irq(tsk, SOFTIRQ_OFFSET); ++} ++ ++static inline void account_softirq_exit(struct task_struct *tsk) ++{ ++ vtime_account_softirq(tsk); ++ irqtime_account_irq(tsk, 0); ++} ++ ++static inline void account_hardirq_enter(struct task_struct *tsk) + { +- vtime_account_irq_enter(tsk); +- irqtime_account_irq(tsk); ++ vtime_account_irq(tsk, HARDIRQ_OFFSET); ++ irqtime_account_irq(tsk, HARDIRQ_OFFSET); + } + +-static inline void account_irq_exit_time(struct task_struct *tsk) ++static inline void account_hardirq_exit(struct task_struct *tsk) + { +- vtime_account_irq_exit(tsk); +- irqtime_account_irq(tsk); ++ vtime_account_hardirq(tsk); ++ irqtime_account_irq(tsk, 0); + } + + #endif /* _LINUX_KERNEL_VTIME_H */ +diff --git a/include/linux/wait.h b/include/linux/wait.h +index 9b8b08331..33001b534 100644 +--- a/include/linux/wait.h ++++ b/include/linux/wait.h +@@ -10,6 +10,7 @@ + + #include + #include ++#include + + typedef struct wait_queue_entry wait_queue_entry_t; + +diff --git a/include/linux/ww_mutex.h b/include/linux/ww_mutex.h +index 6ecf2a022..3145de598 100644 +--- a/include/linux/ww_mutex.h ++++ b/include/linux/ww_mutex.h +@@ -28,6 +28,14 @@ struct ww_class { + unsigned int is_wait_die; + }; + ++struct ww_mutex { ++ struct mutex base; ++ struct ww_acquire_ctx *ctx; ++#ifdef CONFIG_DEBUG_MUTEXES ++ struct ww_class *ww_class; ++#endif ++}; ++ + struct ww_acquire_ctx { + struct task_struct *task; + unsigned long stamp; +diff --git a/include/net/gen_stats.h b/include/net/gen_stats.h +index 1424e02ce..163f8415e 100644 +--- a/include/net/gen_stats.h ++++ b/include/net/gen_stats.h +@@ -6,6 +6,7 @@ + #include + #include + #include ++#include + + /* Note: this used to be in include/uapi/linux/gen_stats.h */ + struct gnet_stats_basic_packed { +@@ -42,15 +43,15 @@ int gnet_stats_start_copy_compat(struct sk_buff *skb, int type, + spinlock_t *lock, struct gnet_dump *d, + int padattr); + +-int gnet_stats_copy_basic(const seqcount_t *running, ++int gnet_stats_copy_basic(net_seqlock_t *running, + struct gnet_dump *d, + struct gnet_stats_basic_cpu __percpu *cpu, + struct gnet_stats_basic_packed *b); +-void __gnet_stats_copy_basic(const seqcount_t *running, ++void __gnet_stats_copy_basic(net_seqlock_t *running, + struct gnet_stats_basic_packed *bstats, + struct gnet_stats_basic_cpu __percpu *cpu, + struct gnet_stats_basic_packed *b); +-int gnet_stats_copy_basic_hw(const seqcount_t *running, ++int gnet_stats_copy_basic_hw(net_seqlock_t *running, + struct gnet_dump *d, + struct gnet_stats_basic_cpu __percpu *cpu, + struct gnet_stats_basic_packed *b); +@@ -70,13 +71,13 @@ int gen_new_estimator(struct gnet_stats_basic_packed *bstats, + struct gnet_stats_basic_cpu __percpu *cpu_bstats, + struct net_rate_estimator __rcu **rate_est, + spinlock_t *lock, +- seqcount_t *running, struct nlattr *opt); ++ net_seqlock_t *running, struct nlattr *opt); + void gen_kill_estimator(struct net_rate_estimator __rcu **ptr); + int gen_replace_estimator(struct gnet_stats_basic_packed *bstats, + struct gnet_stats_basic_cpu __percpu *cpu_bstats, + struct net_rate_estimator __rcu **ptr, + spinlock_t *lock, +- seqcount_t *running, struct nlattr *opt); ++ net_seqlock_t *running, struct nlattr *opt); + bool gen_estimator_active(struct net_rate_estimator __rcu **ptr); + bool gen_estimator_read(struct net_rate_estimator __rcu **ptr, + struct gnet_stats_rate_est64 *sample); +diff --git a/include/net/net_seq_lock.h b/include/net/net_seq_lock.h +new file mode 100644 +index 000000000..67710bace +--- /dev/null ++++ b/include/net/net_seq_lock.h +@@ -0,0 +1,15 @@ ++#ifndef __NET_NET_SEQ_LOCK_H__ ++#define __NET_NET_SEQ_LOCK_H__ ++ ++#ifdef CONFIG_PREEMPT_RT ++# define net_seqlock_t seqlock_t ++# define net_seq_begin(__r) read_seqbegin(__r) ++# define net_seq_retry(__r, __s) read_seqretry(__r, __s) ++ ++#else ++# define net_seqlock_t seqcount_t ++# define net_seq_begin(__r) read_seqcount_begin(__r) ++# define net_seq_retry(__r, __s) read_seqcount_retry(__r, __s) ++#endif ++ ++#endif +diff --git a/include/net/netns/xfrm.h b/include/net/netns/xfrm.h +index 9144e0f09..464d14b2a 100644 +--- a/include/net/netns/xfrm.h ++++ b/include/net/netns/xfrm.h +@@ -74,7 +74,7 @@ struct netns_xfrm { + struct dst_ops xfrm6_dst_ops; + #endif + spinlock_t xfrm_state_lock; +- seqcount_t xfrm_state_hash_generation; ++ seqcount_spinlock_t xfrm_state_hash_generation; + seqcount_spinlock_t xfrm_policy_hash_generation; + + spinlock_t xfrm_policy_lock; +diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h +index 3696246d3..36d01c65d 100644 +--- a/include/net/sch_generic.h ++++ b/include/net/sch_generic.h +@@ -10,6 +10,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -102,7 +103,7 @@ struct Qdisc { + struct sk_buff_head gso_skb ____cacheline_aligned_in_smp; + struct qdisc_skb_head q; + struct gnet_stats_basic_packed bstats; +- seqcount_t running; ++ net_seqlock_t running; + struct gnet_stats_queue qstats; + unsigned long state; + struct Qdisc *next_sched; +@@ -146,7 +147,11 @@ static inline bool qdisc_is_running(struct Qdisc *qdisc) + { + if (qdisc->flags & TCQ_F_NOLOCK) + return spin_is_locked(&qdisc->seqlock); ++#ifdef CONFIG_PREEMPT_RT ++ return spin_is_locked(&qdisc->running.lock) ? true : false; ++#else + return (raw_read_seqcount(&qdisc->running) & 1) ? true : false; ++#endif + } + + static inline bool qdisc_is_percpu_stats(const struct Qdisc *q) +@@ -207,17 +212,35 @@ static inline bool qdisc_run_begin(struct Qdisc *qdisc) + } else if (qdisc_is_running(qdisc)) { + return false; + } ++#ifdef CONFIG_PREEMPT_RT ++ if (spin_trylock(&qdisc->running.lock)) { ++ seqcount_t *s = &qdisc->running.seqcount.seqcount; ++ /* ++ * Variant of write_seqcount_t_begin() telling lockdep that a ++ * trylock was attempted. ++ */ ++ raw_write_seqcount_t_begin(s); ++ seqcount_acquire(&s->dep_map, 0, 1, _RET_IP_); ++ return true; ++ } ++ return false; ++#else + /* Variant of write_seqcount_begin() telling lockdep a trylock + * was attempted. + */ + raw_write_seqcount_begin(&qdisc->running); + seqcount_acquire(&qdisc->running.dep_map, 0, 1, _RET_IP_); + return true; ++#endif + } + + static inline void qdisc_run_end(struct Qdisc *qdisc) + { ++#ifdef CONFIG_PREEMPT_RT ++ write_sequnlock(&qdisc->running); ++#else + write_seqcount_end(&qdisc->running); ++#endif + if (qdisc->flags & TCQ_F_NOLOCK) { + spin_unlock(&qdisc->seqlock); + +@@ -605,7 +628,7 @@ static inline spinlock_t *qdisc_root_sleeping_lock(const struct Qdisc *qdisc) + return qdisc_lock(root); + } + +-static inline seqcount_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc) ++static inline net_seqlock_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc) + { + struct Qdisc *root = qdisc_root_sleeping(qdisc); + +diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h +index c96a4337a..e48f584ab 100644 +--- a/include/trace/events/sched.h ++++ b/include/trace/events/sched.h +@@ -650,6 +650,18 @@ DECLARE_TRACE(sched_update_nr_running_tp, + TP_PROTO(struct rq *rq, int change), + TP_ARGS(rq, change)); + ++DECLARE_TRACE(sched_migrate_disable_tp, ++ TP_PROTO(struct task_struct *p), ++ TP_ARGS(p)); ++ ++DECLARE_TRACE(sched_migrate_enable_tp, ++ TP_PROTO(struct task_struct *p), ++ TP_ARGS(p)); ++ ++DECLARE_TRACE(sched_migrate_pull_tp, ++ TP_PROTO(struct task_struct *p), ++ TP_ARGS(p)); ++ + #endif /* _TRACE_SCHED_H */ + + /* This part must be outside protection */ +diff --git a/init/Kconfig b/init/Kconfig +index 895e0ef85..b45d0474e 100644 +--- a/init/Kconfig ++++ b/init/Kconfig +@@ -861,7 +861,7 @@ config NUMA_BALANCING + bool "Memory placement aware NUMA scheduler" + depends on ARCH_SUPPORTS_NUMA_BALANCING + depends on !ARCH_WANT_NUMA_VARIABLE_LOCALITY +- depends on SMP && NUMA && MIGRATION ++ depends on SMP && NUMA && MIGRATION && !PREEMPT_RT + help + This option adds support for automatic NUMA aware memory/task placement. + The mechanism is quite primitive and is based on migrating memory when +@@ -985,6 +985,7 @@ config CFS_BANDWIDTH + config RT_GROUP_SCHED + bool "Group scheduling for SCHED_RR/FIFO" + depends on CGROUP_SCHED ++ depends on !PREEMPT_RT + default n + help + This feature lets you explicitly allocate real CPU bandwidth +@@ -1947,6 +1948,7 @@ choice + + config SLAB + bool "SLAB" ++ depends on !PREEMPT_RT + select HAVE_HARDENED_USERCOPY_ALLOCATOR + help + The regular slab allocator that is established and known to work +@@ -1967,6 +1969,7 @@ config SLUB + config SLOB + depends on EXPERT + bool "SLOB (Simple Allocator)" ++ depends on !PREEMPT_RT + help + SLOB replaces the stock allocator with a drastically simpler + allocator. SLOB is generally more space efficient but +@@ -2033,7 +2036,7 @@ config SHUFFLE_PAGE_ALLOCATOR + + config SLUB_CPU_PARTIAL + default y +- depends on SLUB && SMP ++ depends on SLUB && SMP && !PREEMPT_RT + bool "SLUB per cpu partial cache" + help + Per cpu partial caches accelerate objects allocation and freeing +diff --git a/kernel/Kconfig.locks b/kernel/Kconfig.locks +index 3de8fd118..4198f0273 100644 +--- a/kernel/Kconfig.locks ++++ b/kernel/Kconfig.locks +@@ -251,7 +251,7 @@ config ARCH_USE_QUEUED_RWLOCKS + + config QUEUED_RWLOCKS + def_bool y if ARCH_USE_QUEUED_RWLOCKS +- depends on SMP ++ depends on SMP && !PREEMPT_RT + + config ARCH_HAS_MMIOWB + bool +diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt +index 416017301..90837a6cb 100644 +--- a/kernel/Kconfig.preempt ++++ b/kernel/Kconfig.preempt +@@ -1,5 +1,11 @@ + # SPDX-License-Identifier: GPL-2.0-only + ++config HAVE_PREEMPT_LAZY ++ bool ++ ++config PREEMPT_LAZY ++ def_bool y if HAVE_PREEMPT_LAZY && PREEMPT_RT ++ + choice + prompt "Preemption Model" + default PREEMPT_NONE +@@ -60,6 +66,7 @@ config PREEMPT_RT + bool "Fully Preemptible Kernel (Real-Time)" + depends on EXPERT && ARCH_SUPPORTS_RT + select PREEMPTION ++ select RT_MUTEXES + help + This option turns the kernel into a real-time kernel by replacing + various locking primitives (spinlocks, rwlocks, etc.) with +diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c +index 01966adce..bab193bde 100644 +--- a/kernel/cgroup/cpuset.c ++++ b/kernel/cgroup/cpuset.c +@@ -351,7 +351,7 @@ void cpuset_read_unlock(void) + percpu_up_read(&cpuset_rwsem); + } + +-static DEFINE_SPINLOCK(callback_lock); ++static DEFINE_RAW_SPINLOCK(callback_lock); + + static struct workqueue_struct *cpuset_migrate_mm_wq; + +@@ -1290,7 +1290,7 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd, + * Newly added CPUs will be removed from effective_cpus and + * newly deleted ones will be added back to effective_cpus. + */ +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + if (adding) { + cpumask_or(parent->subparts_cpus, + parent->subparts_cpus, tmp->addmask); +@@ -1312,7 +1312,7 @@ static int update_parent_subparts_cpumask(struct cpuset *cpuset, int cmd, + + if (cpuset->partition_root_state != new_prs) + cpuset->partition_root_state = new_prs; +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + return cmd == partcmd_update; + } +@@ -1415,7 +1415,7 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp) + continue; + rcu_read_unlock(); + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + + cpumask_copy(cp->effective_cpus, tmp->new_cpus); + if (cp->nr_subparts_cpus && (new_prs != PRS_ENABLED)) { +@@ -1449,7 +1449,7 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp) + if (new_prs != cp->partition_root_state) + cp->partition_root_state = new_prs; + +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + WARN_ON(!is_in_v2_mode() && + !cpumask_equal(cp->cpus_allowed, cp->effective_cpus)); +@@ -1567,7 +1567,7 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, + return -EINVAL; + } + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cpumask_copy(cs->cpus_allowed, trialcs->cpus_allowed); + + /* +@@ -1578,7 +1578,7 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, + cs->cpus_allowed); + cs->nr_subparts_cpus = cpumask_weight(cs->subparts_cpus); + } +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + update_cpumasks_hier(cs, &tmp); + +@@ -1772,9 +1772,9 @@ static void update_nodemasks_hier(struct cpuset *cs, nodemask_t *new_mems) + continue; + rcu_read_unlock(); + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cp->effective_mems = *new_mems; +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + WARN_ON(!is_in_v2_mode() && + !nodes_equal(cp->mems_allowed, cp->effective_mems)); +@@ -1842,9 +1842,9 @@ static int update_nodemask(struct cpuset *cs, struct cpuset *trialcs, + if (retval < 0) + goto done; + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cs->mems_allowed = trialcs->mems_allowed; +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + /* use trialcs->mems_allowed as a temp variable */ + update_nodemasks_hier(cs, &trialcs->mems_allowed); +@@ -1935,9 +1935,9 @@ static int update_flag(cpuset_flagbits_t bit, struct cpuset *cs, + spread_flag_changed = ((is_spread_slab(cs) != is_spread_slab(trialcs)) + || (is_spread_page(cs) != is_spread_page(trialcs))); + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cs->flags = trialcs->flags; +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + if (!cpumask_empty(trialcs->cpus_allowed) && balance_flag_changed) + rebuild_sched_domains_locked(); +@@ -2028,9 +2028,9 @@ static int update_prstate(struct cpuset *cs, int new_prs) + rebuild_sched_domains_locked(); + out: + if (!err) { +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cs->partition_root_state = new_prs; +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + } + + free_cpumasks(NULL, &tmpmask); +@@ -2448,7 +2448,7 @@ static int cpuset_common_seq_show(struct seq_file *sf, void *v) + cpuset_filetype_t type = seq_cft(sf)->private; + int ret = 0; + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + + switch (type) { + case FILE_CPULIST: +@@ -2470,7 +2470,7 @@ static int cpuset_common_seq_show(struct seq_file *sf, void *v) + ret = -EINVAL; + } + +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + return ret; + } + +@@ -2783,14 +2783,14 @@ static int cpuset_css_online(struct cgroup_subsys_state *css) + + cpuset_inc(); + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + if (is_in_v2_mode()) { + cpumask_copy(cs->effective_cpus, parent->effective_cpus); + cs->effective_mems = parent->effective_mems; + cs->use_parent_ecpus = true; + parent->child_ecpus_count++; + } +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + if (!test_bit(CGRP_CPUSET_CLONE_CHILDREN, &css->cgroup->flags)) + goto out_unlock; +@@ -2817,12 +2817,12 @@ static int cpuset_css_online(struct cgroup_subsys_state *css) + } + rcu_read_unlock(); + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cs->mems_allowed = parent->mems_allowed; + cs->effective_mems = parent->mems_allowed; + cpumask_copy(cs->cpus_allowed, parent->cpus_allowed); + cpumask_copy(cs->effective_cpus, parent->cpus_allowed); +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + out_unlock: + percpu_up_write(&cpuset_rwsem); + put_online_cpus(); +@@ -2878,7 +2878,7 @@ static void cpuset_css_free(struct cgroup_subsys_state *css) + static void cpuset_bind(struct cgroup_subsys_state *root_css) + { + percpu_down_write(&cpuset_rwsem); +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + + if (is_in_v2_mode()) { + cpumask_copy(top_cpuset.cpus_allowed, cpu_possible_mask); +@@ -2889,7 +2889,7 @@ static void cpuset_bind(struct cgroup_subsys_state *root_css) + top_cpuset.mems_allowed = top_cpuset.effective_mems; + } + +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + percpu_up_write(&cpuset_rwsem); + } + +@@ -2986,12 +2986,12 @@ hotplug_update_tasks_legacy(struct cpuset *cs, + { + bool is_empty; + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cpumask_copy(cs->cpus_allowed, new_cpus); + cpumask_copy(cs->effective_cpus, new_cpus); + cs->mems_allowed = *new_mems; + cs->effective_mems = *new_mems; +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + /* + * Don't call update_tasks_cpumask() if the cpuset becomes empty, +@@ -3028,10 +3028,10 @@ hotplug_update_tasks(struct cpuset *cs, + if (nodes_empty(*new_mems)) + *new_mems = parent_cs(cs)->effective_mems; + +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cpumask_copy(cs->effective_cpus, new_cpus); + cs->effective_mems = *new_mems; +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + + if (cpus_updated) + update_tasks_cpumask(cs); +@@ -3098,10 +3098,10 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs, struct tmpmasks *tmp) + if (is_partition_root(cs) && (cpumask_empty(&new_cpus) || + (parent->partition_root_state == PRS_ERROR))) { + if (cs->nr_subparts_cpus) { +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cs->nr_subparts_cpus = 0; + cpumask_clear(cs->subparts_cpus); +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + compute_effective_cpumask(&new_cpus, cs, parent); + } + +@@ -3115,9 +3115,9 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs, struct tmpmasks *tmp) + cpumask_empty(&new_cpus)) { + update_parent_subparts_cpumask(cs, partcmd_disable, + NULL, tmp); +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + cs->partition_root_state = PRS_ERROR; +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + } + cpuset_force_rebuild(); + } +@@ -3197,7 +3197,7 @@ static void cpuset_hotplug_workfn(struct work_struct *work) + + /* synchronize cpus_allowed to cpu_active_mask */ + if (cpus_updated) { +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + if (!on_dfl) + cpumask_copy(top_cpuset.cpus_allowed, &new_cpus); + /* +@@ -3217,17 +3217,17 @@ static void cpuset_hotplug_workfn(struct work_struct *work) + } + } + cpumask_copy(top_cpuset.effective_cpus, &new_cpus); +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + /* we don't mess with cpumasks of tasks in top_cpuset */ + } + + /* synchronize mems_allowed to N_MEMORY */ + if (mems_updated) { +- spin_lock_irq(&callback_lock); ++ raw_spin_lock_irq(&callback_lock); + if (!on_dfl) + top_cpuset.mems_allowed = new_mems; + top_cpuset.effective_mems = new_mems; +- spin_unlock_irq(&callback_lock); ++ raw_spin_unlock_irq(&callback_lock); + update_tasks_nodemask(&top_cpuset); + } + +@@ -3328,11 +3328,11 @@ void cpuset_cpus_allowed(struct task_struct *tsk, struct cpumask *pmask) + { + unsigned long flags; + +- spin_lock_irqsave(&callback_lock, flags); ++ raw_spin_lock_irqsave(&callback_lock, flags); + rcu_read_lock(); + guarantee_online_cpus(task_cs(tsk), pmask); + rcu_read_unlock(); +- spin_unlock_irqrestore(&callback_lock, flags); ++ raw_spin_unlock_irqrestore(&callback_lock, flags); + } + + /** +@@ -3393,11 +3393,11 @@ nodemask_t cpuset_mems_allowed(struct task_struct *tsk) + nodemask_t mask; + unsigned long flags; + +- spin_lock_irqsave(&callback_lock, flags); ++ raw_spin_lock_irqsave(&callback_lock, flags); + rcu_read_lock(); + guarantee_online_mems(task_cs(tsk), &mask); + rcu_read_unlock(); +- spin_unlock_irqrestore(&callback_lock, flags); ++ raw_spin_unlock_irqrestore(&callback_lock, flags); + + return mask; + } +@@ -3489,14 +3489,14 @@ bool __cpuset_node_allowed(int node, gfp_t gfp_mask) + return true; + + /* Not hardwall and node outside mems_allowed: scan up cpusets */ +- spin_lock_irqsave(&callback_lock, flags); ++ raw_spin_lock_irqsave(&callback_lock, flags); + + rcu_read_lock(); + cs = nearest_hardwall_ancestor(task_cs(current)); + allowed = node_isset(node, cs->mems_allowed); + rcu_read_unlock(); + +- spin_unlock_irqrestore(&callback_lock, flags); ++ raw_spin_unlock_irqrestore(&callback_lock, flags); + return allowed; + } + +diff --git a/kernel/cgroup/rstat.c b/kernel/cgroup/rstat.c +index d2ae14d0b..7b3bea56d 100644 +--- a/kernel/cgroup/rstat.c ++++ b/kernel/cgroup/rstat.c +@@ -156,8 +156,9 @@ static void cgroup_rstat_flush_locked(struct cgroup *cgrp, bool may_sleep) + raw_spinlock_t *cpu_lock = per_cpu_ptr(&cgroup_rstat_cpu_lock, + cpu); + struct cgroup *pos = NULL; ++ unsigned long flags; + +- raw_spin_lock(cpu_lock); ++ raw_spin_lock_irqsave(cpu_lock, flags); + while ((pos = cgroup_rstat_cpu_pop_updated(pos, cgrp, cpu))) { + struct cgroup_subsys_state *css; + +@@ -169,7 +170,7 @@ static void cgroup_rstat_flush_locked(struct cgroup *cgrp, bool may_sleep) + css->ss->css_rstat_flush(css, cpu); + rcu_read_unlock(); + } +- raw_spin_unlock(cpu_lock); ++ raw_spin_unlock_irqrestore(cpu_lock, flags); + + /* if @may_sleep, play nice and yield if necessary */ + if (may_sleep && (need_resched() || +diff --git a/kernel/cpu.c b/kernel/cpu.c +index c06ced18f..10b6287af 100644 +--- a/kernel/cpu.c ++++ b/kernel/cpu.c +@@ -1662,7 +1662,7 @@ static struct cpuhp_step cpuhp_hp_states[] = { + .name = "ap:online", + }, + /* +- * Handled on controll processor until the plugged processor manages ++ * Handled on control processor until the plugged processor manages + * this itself. + */ + [CPUHP_TEARDOWN_CPU] = { +@@ -1671,6 +1671,13 @@ static struct cpuhp_step cpuhp_hp_states[] = { + .teardown.single = takedown_cpu, + .cant_stop = true, + }, ++ ++ [CPUHP_AP_SCHED_WAIT_EMPTY] = { ++ .name = "sched:waitempty", ++ .startup.single = NULL, ++ .teardown.single = sched_cpu_wait_empty, ++ }, ++ + /* Handle smpboot threads park/unpark */ + [CPUHP_AP_SMPBOOT_THREADS] = { + .name = "smpboot/threads:online", +diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c +index 930ac1b25..dbf1d126a 100644 +--- a/kernel/debug/kdb/kdb_main.c ++++ b/kernel/debug/kdb/kdb_main.c +@@ -2101,7 +2101,7 @@ static int kdb_dmesg(int argc, const char **argv) + int adjust = 0; + int n = 0; + int skip = 0; +- struct kmsg_dumper dumper = { .active = 1 }; ++ struct kmsg_dumper_iter iter = { .active = 1 }; + size_t len; + char buf[201]; + +@@ -2126,8 +2126,8 @@ static int kdb_dmesg(int argc, const char **argv) + kdb_set(2, setargs); + } + +- kmsg_dump_rewind_nolock(&dumper); +- while (kmsg_dump_get_line_nolock(&dumper, 1, NULL, 0, NULL)) ++ kmsg_dump_rewind(&iter); ++ while (kmsg_dump_get_line(&iter, 1, NULL, 0, NULL)) + n++; + + if (lines < 0) { +@@ -2159,8 +2159,8 @@ static int kdb_dmesg(int argc, const char **argv) + if (skip >= n || skip < 0) + return 0; + +- kmsg_dump_rewind_nolock(&dumper); +- while (kmsg_dump_get_line_nolock(&dumper, 1, buf, sizeof(buf), &len)) { ++ kmsg_dump_rewind(&iter); ++ while (kmsg_dump_get_line(&iter, 1, buf, sizeof(buf), &len)) { + if (skip) { + skip--; + continue; +diff --git a/kernel/entry/common.c b/kernel/entry/common.c +index 18a29ca01..f9ff81391 100644 +--- a/kernel/entry/common.c ++++ b/kernel/entry/common.c +@@ -2,6 +2,7 @@ + + #include + #include ++#include + #include + #include + +@@ -148,9 +149,17 @@ static unsigned long exit_to_user_mode_loop(struct pt_regs *regs, + + local_irq_enable_exit_to_user(ti_work); + +- if (ti_work & _TIF_NEED_RESCHED) ++ if (ti_work & _TIF_NEED_RESCHED_MASK) + schedule(); + ++#ifdef ARCH_RT_DELAYS_SIGNAL_SEND ++ if (unlikely(current->forced_info.si_signo)) { ++ struct task_struct *t = current; ++ force_sig_info(&t->forced_info); ++ t->forced_info.si_signo = 0; ++ } ++#endif ++ + if (ti_work & _TIF_UPROBE) + uprobe_notify_resume(regs); + +@@ -206,6 +215,7 @@ static void exit_to_user_mode_prepare(struct pt_regs *regs) + + /* Ensure that the address limit is intact and no locks are held */ + addr_limit_user_check(); ++ kmap_assert_nomap(); + lockdep_assert_irqs_disabled(); + lockdep_sys_exit(); + } +@@ -365,7 +375,7 @@ void irqentry_exit_cond_resched(void) + rcu_irq_exit_check_preempt(); + if (IS_ENABLED(CONFIG_DEBUG_ENTRY)) + WARN_ON_ONCE(!on_thread_stack()); +- if (need_resched()) ++ if (should_resched(0)) + preempt_schedule_irq(); + } + } +diff --git a/kernel/exit.c b/kernel/exit.c +index d13d67fc5..f5933bd07 100644 +--- a/kernel/exit.c ++++ b/kernel/exit.c +@@ -152,7 +152,7 @@ static void __exit_signal(struct task_struct *tsk) + * Do this under ->siglock, we can race with another thread + * doing sigqueue_free() if we have SIGQUEUE_PREALLOC signals. + */ +- flush_sigqueue(&tsk->pending); ++ flush_task_sigqueue(tsk); + tsk->sighand = NULL; + spin_unlock(&sighand->siglock); + +diff --git a/kernel/fork.c b/kernel/fork.c +index f3e3f5389..db8554a61 100644 +--- a/kernel/fork.c ++++ b/kernel/fork.c +@@ -42,6 +42,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -290,7 +291,7 @@ static inline void free_thread_stack(struct task_struct *tsk) + return; + } + +- vfree_atomic(tsk->stack); ++ vfree(tsk->stack); + return; + } + #endif +@@ -691,6 +692,19 @@ void __mmdrop(struct mm_struct *mm) + } + EXPORT_SYMBOL_GPL(__mmdrop); + ++#ifdef CONFIG_PREEMPT_RT ++/* ++ * RCU callback for delayed mm drop. Not strictly rcu, but we don't ++ * want another facility to make this work. ++ */ ++void __mmdrop_delayed(struct rcu_head *rhp) ++{ ++ struct mm_struct *mm = container_of(rhp, struct mm_struct, delayed_drop); ++ ++ __mmdrop(mm); ++} ++#endif ++ + static void mmdrop_async_fn(struct work_struct *work) + { + struct mm_struct *mm; +@@ -732,6 +746,15 @@ void __put_task_struct(struct task_struct *tsk) + WARN_ON(refcount_read(&tsk->usage)); + WARN_ON(tsk == current); + ++ /* ++ * Remove function-return probe instances associated with this ++ * task and put them back on the free list. ++ */ ++ kprobe_flush_task(tsk); ++ ++ /* Task is done with its stack. */ ++ put_task_stack(tsk); ++ + io_uring_free(tsk); + cgroup_free(tsk); + task_numa_free(tsk, true); +@@ -929,10 +952,12 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node) + tsk->splice_pipe = NULL; + tsk->task_frag.page = NULL; + tsk->wake_q.next = NULL; ++ tsk->wake_q_sleeper.next = NULL; + + account_kernel_stack(tsk, 1); + + kcov_task_init(tsk); ++ kmap_local_fork(tsk); + + #ifdef CONFIG_FAULT_INJECTION + tsk->fail_nth = 0; +@@ -2028,6 +2053,7 @@ static __latent_entropy struct task_struct *copy_process( + spin_lock_init(&p->alloc_lock); + + init_sigpending(&p->pending); ++ p->sigqueue_cache = NULL; + + p->utime = p->stime = p->gtime = 0; + #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME +diff --git a/kernel/futex.c b/kernel/futex.c +index 98a6e1b80..b2b275bc1 100644 +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -1498,6 +1498,7 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_pi_state *pi_ + struct task_struct *new_owner; + bool postunlock = false; + DEFINE_WAKE_Q(wake_q); ++ DEFINE_WAKE_Q(wake_sleeper_q); + int ret = 0; + + new_owner = rt_mutex_next_owner(&pi_state->pi_mutex); +@@ -1547,14 +1548,15 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_pi_state *pi_ + * not fail. + */ + pi_state_update_owner(pi_state, new_owner); +- postunlock = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q); ++ postunlock = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q, ++ &wake_sleeper_q); + } + + out_unlock: + raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock); + + if (postunlock) +- rt_mutex_postunlock(&wake_q); ++ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); + + return ret; + } +@@ -2155,6 +2157,16 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, + */ + requeue_pi_wake_futex(this, &key2, hb2); + continue; ++ } else if (ret == -EAGAIN) { ++ /* ++ * Waiter was woken by timeout or ++ * signal and has set pi_blocked_on to ++ * PI_WAKEUP_INPROGRESS before we ++ * tried to enqueue it on the rtmutex. ++ */ ++ this->pi_state = NULL; ++ put_pi_state(pi_state); ++ continue; + } else if (ret) { + /* + * rt_mutex_start_proxy_lock() detected a +@@ -2847,7 +2859,7 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int flags, + goto no_block; + } + +- rt_mutex_init_waiter(&rt_waiter); ++ rt_mutex_init_waiter(&rt_waiter, false); + + /* + * On PREEMPT_RT_FULL, when hb->lock becomes an rt_mutex, we must not +@@ -3172,7 +3184,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + { + struct hrtimer_sleeper timeout, *to; + struct rt_mutex_waiter rt_waiter; +- struct futex_hash_bucket *hb; ++ struct futex_hash_bucket *hb, *hb2; + union futex_key key2 = FUTEX_KEY_INIT; + struct futex_q q = futex_q_init; + int res, ret; +@@ -3193,7 +3205,7 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + * The waiter is allocated on our stack, manipulated by the requeue + * code while we sleep on uaddr. + */ +- rt_mutex_init_waiter(&rt_waiter); ++ rt_mutex_init_waiter(&rt_waiter, false); + + ret = get_futex_key(uaddr2, flags & FLAGS_SHARED, &key2, FUTEX_WRITE); + if (unlikely(ret != 0)) +@@ -3224,20 +3236,55 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + /* Queue the futex_q, drop the hb lock, wait for wakeup. */ + futex_wait_queue_me(hb, &q, to); + +- spin_lock(&hb->lock); +- ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); +- spin_unlock(&hb->lock); +- if (ret) +- goto out; ++ /* ++ * On RT we must avoid races with requeue and trying to block ++ * on two mutexes (hb->lock and uaddr2's rtmutex) by ++ * serializing access to pi_blocked_on with pi_lock. ++ */ ++ raw_spin_lock_irq(¤t->pi_lock); ++ if (current->pi_blocked_on) { ++ /* ++ * We have been requeued or are in the process of ++ * being requeued. ++ */ ++ raw_spin_unlock_irq(¤t->pi_lock); ++ } else { ++ /* ++ * Setting pi_blocked_on to PI_WAKEUP_INPROGRESS ++ * prevents a concurrent requeue from moving us to the ++ * uaddr2 rtmutex. After that we can safely acquire ++ * (and possibly block on) hb->lock. ++ */ ++ current->pi_blocked_on = PI_WAKEUP_INPROGRESS; ++ raw_spin_unlock_irq(¤t->pi_lock); ++ ++ spin_lock(&hb->lock); ++ ++ /* ++ * Clean up pi_blocked_on. We might leak it otherwise ++ * when we succeeded with the hb->lock in the fast ++ * path. ++ */ ++ raw_spin_lock_irq(¤t->pi_lock); ++ current->pi_blocked_on = NULL; ++ raw_spin_unlock_irq(¤t->pi_lock); ++ ++ ret = handle_early_requeue_pi_wakeup(hb, &q, &key2, to); ++ spin_unlock(&hb->lock); ++ if (ret) ++ goto out; ++ } + + /* +- * In order for us to be here, we know our q.key == key2, and since +- * we took the hb->lock above, we also know that futex_requeue() has +- * completed and we no longer have to concern ourselves with a wakeup +- * race with the atomic proxy lock acquisition by the requeue code. The +- * futex_requeue dropped our key1 reference and incremented our key2 +- * reference count. ++ * In order to be here, we have either been requeued, are in ++ * the process of being requeued, or requeue successfully ++ * acquired uaddr2 on our behalf. If pi_blocked_on was ++ * non-null above, we may be racing with a requeue. Do not ++ * rely on q->lock_ptr to be hb2->lock until after blocking on ++ * hb->lock or hb2->lock. The futex_requeue dropped our key1 ++ * reference and incremented our key2 reference count. + */ ++ hb2 = hash_futex(&key2); + + /* Check if the requeue code acquired the second futex for us. */ + if (!q.rt_waiter) { +@@ -3246,14 +3293,15 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + * did a lock-steal - fix up the PI-state in that case. + */ + if (q.pi_state && (q.pi_state->owner != current)) { +- spin_lock(q.lock_ptr); ++ spin_lock(&hb2->lock); ++ BUG_ON(&hb2->lock != q.lock_ptr); + ret = fixup_pi_state_owner(uaddr2, &q, current); + /* + * Drop the reference to the pi state which + * the requeue_pi() code acquired for us. + */ + put_pi_state(q.pi_state); +- spin_unlock(q.lock_ptr); ++ spin_unlock(&hb2->lock); + /* + * Adjust the return value. It's either -EFAULT or + * success (1) but the caller expects 0 for success. +@@ -3272,7 +3320,8 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, + pi_mutex = &q.pi_state->pi_mutex; + ret = rt_mutex_wait_proxy_lock(pi_mutex, to, &rt_waiter); + +- spin_lock(q.lock_ptr); ++ spin_lock(&hb2->lock); ++ BUG_ON(&hb2->lock != q.lock_ptr); + if (ret && !rt_mutex_cleanup_proxy_lock(pi_mutex, &rt_waiter)) + ret = 0; + +diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c +index 762a928e1..7929fcdb7 100644 +--- a/kernel/irq/handle.c ++++ b/kernel/irq/handle.c +@@ -192,10 +192,16 @@ irqreturn_t handle_irq_event_percpu(struct irq_desc *desc) + { + irqreturn_t retval; + unsigned int flags = 0; ++ struct pt_regs *regs = get_irq_regs(); ++ u64 ip = regs ? instruction_pointer(regs) : 0; + + retval = __handle_irq_event_percpu(desc, &flags); + +- add_interrupt_randomness(desc->irq_data.irq, flags); ++#ifdef CONFIG_PREEMPT_RT ++ desc->random_ip = ip; ++#else ++ add_interrupt_randomness(desc->irq_data.irq, flags, ip); ++#endif + + if (!noirqdebug) + note_interrupt(desc, retval); +diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c +index d3033e1f9..4f7885934 100644 +--- a/kernel/irq/manage.c ++++ b/kernel/irq/manage.c +@@ -1260,6 +1260,8 @@ static int irq_thread(void *data) + irqreturn_t (*handler_fn)(struct irq_desc *desc, + struct irqaction *action); + ++ sched_set_fifo(current); ++ + if (force_irqthreads && test_bit(IRQTF_FORCED_THREAD, + &action->thread_flags)) + handler_fn = irq_forced_thread_fn; +@@ -1280,6 +1282,12 @@ static int irq_thread(void *data) + if (action_ret == IRQ_WAKE_THREAD) + irq_wake_secondary(desc, action); + ++ if (IS_ENABLED(CONFIG_PREEMPT_RT)) { ++ migrate_disable(); ++ add_interrupt_randomness(action->irq, 0, ++ desc->random_ip ^ (unsigned long) action); ++ migrate_enable(); ++ } + wake_threads_waitq(desc); + } + +@@ -1425,8 +1433,6 @@ setup_irq_thread(struct irqaction *new, unsigned int irq, bool secondary) + if (IS_ERR(t)) + return PTR_ERR(t); + +- sched_set_fifo(t); +- + /* + * We keep the reference to the task struct even if + * the thread dies to avoid that the interrupt code +@@ -2823,7 +2829,7 @@ EXPORT_SYMBOL_GPL(irq_get_irqchip_state); + * This call sets the internal irqchip state of an interrupt, + * depending on the value of @which. + * +- * This function should be called with preemption disabled if the ++ * This function should be called with migration disabled if the + * interrupt controller has per-cpu registers. + */ + int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which, +diff --git a/kernel/irq/spurious.c b/kernel/irq/spurious.c +index f865e5f4d..dc7311dd7 100644 +--- a/kernel/irq/spurious.c ++++ b/kernel/irq/spurious.c +@@ -443,6 +443,10 @@ MODULE_PARM_DESC(noirqdebug, "Disable irq lockup detection when true"); + + static int __init irqfixup_setup(char *str) + { ++#ifdef CONFIG_PREEMPT_RT ++ pr_warn("irqfixup boot option not supported w/ CONFIG_PREEMPT_RT\n"); ++ return 1; ++#endif + irqfixup = 1; + printk(KERN_WARNING "Misrouted IRQ fixup support enabled.\n"); + printk(KERN_WARNING "This may impact system performance.\n"); +@@ -455,6 +459,10 @@ module_param(irqfixup, int, 0644); + + static int __init irqpoll_setup(char *str) + { ++#ifdef CONFIG_PREEMPT_RT ++ pr_warn("irqpoll boot option not supported w/ CONFIG_PREEMPT_RT\n"); ++ return 1; ++#endif + irqfixup = 2; + printk(KERN_WARNING "Misrouted IRQ fixup and polling support " + "enabled\n"); +diff --git a/kernel/irq_work.c b/kernel/irq_work.c +index fbff25adb..d3466e3ba 100644 +--- a/kernel/irq_work.c ++++ b/kernel/irq_work.c +@@ -18,11 +18,36 @@ + #include + #include + #include ++#include + #include + + + static DEFINE_PER_CPU(struct llist_head, raised_list); + static DEFINE_PER_CPU(struct llist_head, lazy_list); ++static DEFINE_PER_CPU(struct task_struct *, irq_workd); ++ ++static void wake_irq_workd(void) ++{ ++ struct task_struct *tsk = __this_cpu_read(irq_workd); ++ ++ if (!llist_empty(this_cpu_ptr(&lazy_list)) && tsk) ++ wake_up_process(tsk); ++} ++ ++#ifdef CONFIG_SMP ++static void irq_work_wake(struct irq_work *entry) ++{ ++ wake_irq_workd(); ++} ++ ++static DEFINE_PER_CPU(struct irq_work, irq_work_wakeup) = ++ IRQ_WORK_INIT_HARD(irq_work_wake); ++#endif ++ ++static int irq_workd_should_run(unsigned int cpu) ++{ ++ return !llist_empty(this_cpu_ptr(&lazy_list)); ++} + + /* + * Claim the entry so that no one else will poke at it. +@@ -52,15 +77,29 @@ void __weak arch_irq_work_raise(void) + /* Enqueue on current CPU, work must already be claimed and preempt disabled */ + static void __irq_work_queue_local(struct irq_work *work) + { +- /* If the work is "lazy", handle it from next tick if any */ +- if (atomic_read(&work->node.a_flags) & IRQ_WORK_LAZY) { +- if (llist_add(&work->node.llist, this_cpu_ptr(&lazy_list)) && +- tick_nohz_tick_stopped()) +- arch_irq_work_raise(); +- } else { +- if (llist_add(&work->node.llist, this_cpu_ptr(&raised_list))) +- arch_irq_work_raise(); +- } ++ struct llist_head *list; ++ bool rt_lazy_work = false; ++ bool lazy_work = false; ++ int work_flags; ++ ++ work_flags = atomic_read(&work->node.a_flags); ++ if (work_flags & IRQ_WORK_LAZY) ++ lazy_work = true; ++ else if (IS_ENABLED(CONFIG_PREEMPT_RT) && ++ !(work_flags & IRQ_WORK_HARD_IRQ)) ++ rt_lazy_work = true; ++ ++ if (lazy_work || rt_lazy_work) ++ list = this_cpu_ptr(&lazy_list); ++ else ++ list = this_cpu_ptr(&raised_list); ++ ++ if (!llist_add(&work->node.llist, list)) ++ return; ++ ++ /* If the work is "lazy", handle it from next tick if any */ ++ if (!lazy_work || tick_nohz_tick_stopped()) ++ arch_irq_work_raise(); + } + + /* Enqueue the irq work @work on the current CPU */ +@@ -102,10 +141,28 @@ bool irq_work_queue_on(struct irq_work *work, int cpu) + if (cpu != smp_processor_id()) { + /* Arch remote IPI send/receive backend aren't NMI safe */ + WARN_ON_ONCE(in_nmi()); +- __smp_call_single_queue(cpu, &work->node.llist); ++ ++ /* ++ * On PREEMPT_RT the items which are not marked as ++ * IRQ_WORK_HARD_IRQ are added to the lazy list and a HARD work ++ * item is used on the remote CPU to wake the thread. ++ */ ++ if (IS_ENABLED(CONFIG_PREEMPT_RT) && ++ !(atomic_read(&work->node.a_flags) & IRQ_WORK_HARD_IRQ)) { ++ ++ if (!llist_add(&work->node.llist, &per_cpu(lazy_list, cpu))) ++ goto out; ++ ++ work = &per_cpu(irq_work_wakeup, cpu); ++ if (!irq_work_claim(work)) ++ goto out; ++ } ++ ++ __smp_call_single_queue(cpu, &work->node.llist); + } else { + __irq_work_queue_local(work); + } ++out: + preempt_enable(); + + return true; +@@ -153,14 +210,23 @@ void irq_work_single(void *arg) + */ + flags &= ~IRQ_WORK_PENDING; + (void)atomic_cmpxchg(&work->node.a_flags, flags, flags & ~IRQ_WORK_BUSY); ++ ++ if ((IS_ENABLED(CONFIG_PREEMPT_RT) && !irq_work_is_hard(work)) || ++ !arch_irq_work_has_interrupt()) ++ rcuwait_wake_up(&work->irqwait); + } + + static void irq_work_run_list(struct llist_head *list) + { + struct irq_work *work, *tmp; + struct llist_node *llnode; +- +- BUG_ON(!irqs_disabled()); ++ ++ /* ++ * On PREEMPT_RT IRQ-work which is not marked as HARD will be processed ++ * in a per-CPU thread in preemptible context. Only the items which are ++ * marked as IRQ_WORK_HARD_IRQ will be processed in hardirq context. ++ */ ++ BUG_ON(!irqs_disabled() && !IS_ENABLED(CONFIG_PREEMPT_RT)); + + if (llist_empty(list)) + return; +@@ -177,7 +243,10 @@ static void irq_work_run_list(struct llist_head *list) + void irq_work_run(void) + { + irq_work_run_list(this_cpu_ptr(&raised_list)); +- irq_work_run_list(this_cpu_ptr(&lazy_list)); ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) ++ irq_work_run_list(this_cpu_ptr(&lazy_list)); ++ else ++ wake_irq_workd(); + } + EXPORT_SYMBOL_GPL(irq_work_run); + +@@ -187,7 +256,10 @@ void irq_work_tick(void) + + if (!llist_empty(raised) && !arch_irq_work_has_interrupt()) + irq_work_run_list(raised); +- irq_work_run_list(this_cpu_ptr(&lazy_list)); ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) ++ irq_work_run_list(this_cpu_ptr(&lazy_list)); ++ else ++ wake_irq_workd(); + } + + /* +@@ -197,8 +269,42 @@ void irq_work_tick(void) + void irq_work_sync(struct irq_work *work) + { + lockdep_assert_irqs_enabled(); ++ might_sleep(); ++ ++ if ((IS_ENABLED(CONFIG_PREEMPT_RT) && !irq_work_is_hard(work)) || ++ !arch_irq_work_has_interrupt()) { ++ rcuwait_wait_event(&work->irqwait, !irq_work_is_busy(work), ++ TASK_UNINTERRUPTIBLE); ++ return; ++ } + + while (irq_work_is_busy(work)) + cpu_relax(); + } + EXPORT_SYMBOL_GPL(irq_work_sync); ++ ++static void run_irq_workd(unsigned int cpu) ++{ ++ irq_work_run_list(this_cpu_ptr(&lazy_list)); ++} ++ ++static void irq_workd_setup(unsigned int cpu) ++{ ++ sched_set_fifo_low(current); ++} ++ ++static struct smp_hotplug_thread irqwork_threads = { ++ .store = &irq_workd, ++ .setup = irq_workd_setup, ++ .thread_should_run = irq_workd_should_run, ++ .thread_fn = run_irq_workd, ++ .thread_comm = "irq_work/%u", ++}; ++ ++static __init int irq_work_init_threads(void) ++{ ++ if (IS_ENABLED(CONFIG_PREEMPT_RT)) ++ BUG_ON(smpboot_register_percpu_thread(&irqwork_threads)); ++ return 0; ++} ++early_initcall(irq_work_init_threads); +diff --git a/kernel/kexec_core.c b/kernel/kexec_core.c +index b9a6f4658..c26219f34 100644 +--- a/kernel/kexec_core.c ++++ b/kernel/kexec_core.c +@@ -984,7 +984,6 @@ void crash_kexec(struct pt_regs *regs) + old_cpu = atomic_cmpxchg(&panic_cpu, PANIC_CPU_INVALID, this_cpu); + if (old_cpu == PANIC_CPU_INVALID) { + /* This is the 1st CPU which comes here, so go ahead. */ +- printk_safe_flush_on_panic(); + __crash_kexec(regs); + + /* +diff --git a/kernel/ksysfs.c b/kernel/ksysfs.c +index 35859da8b..dfff31ed6 100644 +--- a/kernel/ksysfs.c ++++ b/kernel/ksysfs.c +@@ -138,6 +138,15 @@ KERNEL_ATTR_RO(vmcoreinfo); + + #endif /* CONFIG_CRASH_CORE */ + ++#if defined(CONFIG_PREEMPT_RT) ++static ssize_t realtime_show(struct kobject *kobj, ++ struct kobj_attribute *attr, char *buf) ++{ ++ return sprintf(buf, "%d\n", 1); ++} ++KERNEL_ATTR_RO(realtime); ++#endif ++ + /* whether file capabilities are enabled */ + static ssize_t fscaps_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +@@ -228,6 +237,9 @@ static struct attribute * kernel_attrs[] = { + #ifndef CONFIG_TINY_RCU + &rcu_expedited_attr.attr, + &rcu_normal_attr.attr, ++#endif ++#ifdef CONFIG_PREEMPT_RT ++ &realtime_attr.attr, + #endif + NULL + }; +diff --git a/kernel/kthread.c b/kernel/kthread.c +index 508fe5278..3ce6a31db 100644 +--- a/kernel/kthread.c ++++ b/kernel/kthread.c +@@ -264,6 +264,7 @@ EXPORT_SYMBOL_GPL(kthread_parkme); + + static int kthread(void *_create) + { ++ static const struct sched_param param = { .sched_priority = 0 }; + /* Copy data: it's on kthread's stack */ + struct kthread_create_info *create = _create; + int (*threadfn)(void *data) = create->threadfn; +@@ -294,6 +295,13 @@ static int kthread(void *_create) + init_completion(&self->parked); + current->vfork_done = &self->exited; + ++ /* ++ * The new thread inherited kthreadd's priority and CPU mask. Reset ++ * back to default in case they have been changed. ++ */ ++ sched_setscheduler_nocheck(current, SCHED_NORMAL, ¶m); ++ set_cpus_allowed_ptr(current, housekeeping_cpumask(HK_FLAG_KTHREAD)); ++ + /* OK, tell user we're spawned, wait for stop or wakeup */ + __set_current_state(TASK_UNINTERRUPTIBLE); + create->result = current; +@@ -391,7 +399,6 @@ struct task_struct *__kthread_create_on_node(int (*threadfn)(void *data), + } + task = create->result; + if (!IS_ERR(task)) { +- static const struct sched_param param = { .sched_priority = 0 }; + char name[TASK_COMM_LEN]; + + /* +@@ -400,13 +407,6 @@ struct task_struct *__kthread_create_on_node(int (*threadfn)(void *data), + */ + vsnprintf(name, sizeof(name), namefmt, args); + set_task_comm(task, name); +- /* +- * root may have changed our (kthreadd's) priority or CPU mask. +- * The kernel thread should not inherit these properties. +- */ +- sched_setscheduler_nocheck(task, SCHED_NORMAL, ¶m); +- set_cpus_allowed_ptr(task, +- housekeeping_cpumask(HK_FLAG_KTHREAD)); + } + kfree(create); + return task; +diff --git a/kernel/locking/Makefile b/kernel/locking/Makefile +index 6d11cfb9b..c7fbf737e 100644 +--- a/kernel/locking/Makefile ++++ b/kernel/locking/Makefile +@@ -3,7 +3,7 @@ + # and is generally not a function of system call inputs. + KCOV_INSTRUMENT := n + +-obj-y += mutex.o semaphore.o rwsem.o percpu-rwsem.o ++obj-y += semaphore.o rwsem.o percpu-rwsem.o + + # Avoid recursion lockdep -> KCSAN -> ... -> lockdep. + KCSAN_SANITIZE_lockdep.o := n +@@ -15,19 +15,23 @@ CFLAGS_REMOVE_mutex-debug.o = $(CC_FLAGS_FTRACE) + CFLAGS_REMOVE_rtmutex-debug.o = $(CC_FLAGS_FTRACE) + endif + +-obj-$(CONFIG_DEBUG_MUTEXES) += mutex-debug.o + obj-$(CONFIG_LOCKDEP) += lockdep.o + ifeq ($(CONFIG_PROC_FS),y) + obj-$(CONFIG_LOCKDEP) += lockdep_proc.o + endif + obj-$(CONFIG_SMP) += spinlock.o +-obj-$(CONFIG_LOCK_SPIN_ON_OWNER) += osq_lock.o + obj-$(CONFIG_PROVE_LOCKING) += spinlock.o + obj-$(CONFIG_QUEUED_SPINLOCKS) += qspinlock.o + obj-$(CONFIG_RT_MUTEXES) += rtmutex.o + obj-$(CONFIG_DEBUG_RT_MUTEXES) += rtmutex-debug.o + obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock.o + obj-$(CONFIG_DEBUG_SPINLOCK) += spinlock_debug.o ++ifneq ($(CONFIG_PREEMPT_RT),y) ++obj-y += mutex.o ++obj-$(CONFIG_LOCK_SPIN_ON_OWNER) += osq_lock.o ++obj-$(CONFIG_DEBUG_MUTEXES) += mutex-debug.o ++endif ++obj-$(CONFIG_PREEMPT_RT) += mutex-rt.o rwsem-rt.o rwlock-rt.o + obj-$(CONFIG_QUEUED_RWLOCKS) += qrwlock.o + obj-$(CONFIG_LOCK_TORTURE_TEST) += locktorture.o + obj-$(CONFIG_WW_MUTEX_SELFTEST) += test-ww_mutex.o +diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c +index 1f6a2f122..cfd0164f8 100644 +--- a/kernel/locking/lockdep.c ++++ b/kernel/locking/lockdep.c +@@ -5410,6 +5410,7 @@ static noinstr void check_flags(unsigned long flags) + } + } + ++#ifndef CONFIG_PREEMPT_RT + /* + * We dont accurately track softirq state in e.g. + * hardirq contexts (such as on 4KSTACKS), so only +@@ -5424,6 +5425,7 @@ static noinstr void check_flags(unsigned long flags) + DEBUG_LOCKS_WARN_ON(!current->softirqs_enabled); + } + } ++#endif + + if (!debug_locks) + print_irqtrace_events(current); +diff --git a/kernel/locking/mutex-rt.c b/kernel/locking/mutex-rt.c +new file mode 100644 +index 000000000..2b849e6b9 +--- /dev/null ++++ b/kernel/locking/mutex-rt.c +@@ -0,0 +1,224 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++/* ++ * Real-Time Preemption Support ++ * ++ * started by Ingo Molnar: ++ * ++ * Copyright (C) 2004-2006 Red Hat, Inc., Ingo Molnar ++ * Copyright (C) 2006, Timesys Corp., Thomas Gleixner ++ * ++ * historic credit for proving that Linux spinlocks can be implemented via ++ * RT-aware mutexes goes to many people: The Pmutex project (Dirk Grambow ++ * and others) who prototyped it on 2.4 and did lots of comparative ++ * research and analysis; TimeSys, for proving that you can implement a ++ * fully preemptible kernel via the use of IRQ threading and mutexes; ++ * Bill Huey for persuasively arguing on lkml that the mutex model is the ++ * right one; and to MontaVista, who ported pmutexes to 2.6. ++ * ++ * This code is a from-scratch implementation and is not based on pmutexes, ++ * but the idea of converting spinlocks to mutexes is used here too. ++ * ++ * lock debugging, locking tree, deadlock detection: ++ * ++ * Copyright (C) 2004, LynuxWorks, Inc., Igor Manyilov, Bill Huey ++ * Released under the General Public License (GPL). ++ * ++ * Includes portions of the generic R/W semaphore implementation from: ++ * ++ * Copyright (c) 2001 David Howells (dhowells@redhat.com). ++ * - Derived partially from idea by Andrea Arcangeli ++ * - Derived also from comments by Linus ++ * ++ * Pending ownership of locks and ownership stealing: ++ * ++ * Copyright (C) 2005, Kihon Technologies Inc., Steven Rostedt ++ * ++ * (also by Steven Rostedt) ++ * - Converted single pi_lock to individual task locks. ++ * ++ * By Esben Nielsen: ++ * Doing priority inheritance with help of the scheduler. ++ * ++ * Copyright (C) 2006, Timesys Corp., Thomas Gleixner ++ * - major rework based on Esben Nielsens initial patch ++ * - replaced thread_info references by task_struct refs ++ * - removed task->pending_owner dependency ++ * - BKL drop/reacquire for semaphore style locks to avoid deadlocks ++ * in the scheduler return path as discussed with Steven Rostedt ++ * ++ * Copyright (C) 2006, Kihon Technologies Inc. ++ * Steven Rostedt ++ * - debugged and patched Thomas Gleixner's rework. ++ * - added back the cmpxchg to the rework. ++ * - turned atomic require back on for SMP. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "rtmutex_common.h" ++ ++/* ++ * struct mutex functions ++ */ ++void __mutex_do_init(struct mutex *mutex, const char *name, ++ struct lock_class_key *key) ++{ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ /* ++ * Make sure we are not reinitializing a held lock: ++ */ ++ debug_check_no_locks_freed((void *)mutex, sizeof(*mutex)); ++ lockdep_init_map(&mutex->dep_map, name, key, 0); ++#endif ++ mutex->lock.save_state = 0; ++} ++EXPORT_SYMBOL(__mutex_do_init); ++ ++static int _mutex_lock_blk_flush(struct mutex *lock, int state) ++{ ++ /* ++ * Flush blk before ->pi_blocked_on is set. At schedule() time it is too ++ * late if one of the callbacks needs to acquire a sleeping lock. ++ */ ++ if (blk_needs_flush_plug(current)) ++ blk_schedule_flush_plug(current); ++ return __rt_mutex_lock_state(&lock->lock, state); ++} ++ ++void __lockfunc _mutex_lock(struct mutex *lock) ++{ ++ mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); ++ _mutex_lock_blk_flush(lock, TASK_UNINTERRUPTIBLE); ++} ++EXPORT_SYMBOL(_mutex_lock); ++ ++void __lockfunc _mutex_lock_io_nested(struct mutex *lock, int subclass) ++{ ++ int token; ++ ++ token = io_schedule_prepare(); ++ ++ mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_); ++ __rt_mutex_lock_state(&lock->lock, TASK_UNINTERRUPTIBLE); ++ ++ io_schedule_finish(token); ++} ++EXPORT_SYMBOL_GPL(_mutex_lock_io_nested); ++ ++int __lockfunc _mutex_lock_interruptible(struct mutex *lock) ++{ ++ int ret; ++ ++ mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); ++ ret = _mutex_lock_blk_flush(lock, TASK_INTERRUPTIBLE); ++ if (ret) ++ mutex_release(&lock->dep_map, _RET_IP_); ++ return ret; ++} ++EXPORT_SYMBOL(_mutex_lock_interruptible); ++ ++int __lockfunc _mutex_lock_killable(struct mutex *lock) ++{ ++ int ret; ++ ++ mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); ++ ret = _mutex_lock_blk_flush(lock, TASK_KILLABLE); ++ if (ret) ++ mutex_release(&lock->dep_map, _RET_IP_); ++ return ret; ++} ++EXPORT_SYMBOL(_mutex_lock_killable); ++ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++void __lockfunc _mutex_lock_nested(struct mutex *lock, int subclass) ++{ ++ mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_); ++ _mutex_lock_blk_flush(lock, TASK_UNINTERRUPTIBLE); ++} ++EXPORT_SYMBOL(_mutex_lock_nested); ++ ++void __lockfunc _mutex_lock_nest_lock(struct mutex *lock, struct lockdep_map *nest) ++{ ++ mutex_acquire_nest(&lock->dep_map, 0, 0, nest, _RET_IP_); ++ _mutex_lock_blk_flush(lock, TASK_UNINTERRUPTIBLE); ++} ++EXPORT_SYMBOL(_mutex_lock_nest_lock); ++ ++int __lockfunc _mutex_lock_interruptible_nested(struct mutex *lock, int subclass) ++{ ++ int ret; ++ ++ mutex_acquire_nest(&lock->dep_map, subclass, 0, NULL, _RET_IP_); ++ ret = _mutex_lock_blk_flush(lock, TASK_INTERRUPTIBLE); ++ if (ret) ++ mutex_release(&lock->dep_map, _RET_IP_); ++ return ret; ++} ++EXPORT_SYMBOL(_mutex_lock_interruptible_nested); ++ ++int __lockfunc _mutex_lock_killable_nested(struct mutex *lock, int subclass) ++{ ++ int ret; ++ ++ mutex_acquire(&lock->dep_map, subclass, 0, _RET_IP_); ++ ret = _mutex_lock_blk_flush(lock, TASK_KILLABLE); ++ if (ret) ++ mutex_release(&lock->dep_map, _RET_IP_); ++ return ret; ++} ++EXPORT_SYMBOL(_mutex_lock_killable_nested); ++#endif ++ ++int __lockfunc _mutex_trylock(struct mutex *lock) ++{ ++ int ret = __rt_mutex_trylock(&lock->lock); ++ ++ if (ret) ++ mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_); ++ ++ return ret; ++} ++EXPORT_SYMBOL(_mutex_trylock); ++ ++void __lockfunc _mutex_unlock(struct mutex *lock) ++{ ++ mutex_release(&lock->dep_map, _RET_IP_); ++ __rt_mutex_unlock(&lock->lock); ++} ++EXPORT_SYMBOL(_mutex_unlock); ++ ++/** ++ * atomic_dec_and_mutex_lock - return holding mutex if we dec to 0 ++ * @cnt: the atomic which we are to dec ++ * @lock: the mutex to return holding if we dec to 0 ++ * ++ * return true and hold lock if we dec to 0, return false otherwise ++ */ ++int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock) ++{ ++ /* dec if we can't possibly hit 0 */ ++ if (atomic_add_unless(cnt, -1, 1)) ++ return 0; ++ /* we might hit 0, so take the lock */ ++ mutex_lock(lock); ++ if (!atomic_dec_and_test(cnt)) { ++ /* when we actually did the dec, we didn't hit 0 */ ++ mutex_unlock(lock); ++ return 0; ++ } ++ /* we hit 0, and we hold the lock */ ++ return 1; ++} ++EXPORT_SYMBOL(atomic_dec_and_mutex_lock); +diff --git a/kernel/locking/rtmutex-debug.c b/kernel/locking/rtmutex-debug.c +index 36e69100e..fb1501003 100644 +--- a/kernel/locking/rtmutex-debug.c ++++ b/kernel/locking/rtmutex-debug.c +@@ -32,110 +32,12 @@ + + #include "rtmutex_common.h" + +-static void printk_task(struct task_struct *p) +-{ +- if (p) +- printk("%16s:%5d [%p, %3d]", p->comm, task_pid_nr(p), p, p->prio); +- else +- printk(""); +-} +- +-static void printk_lock(struct rt_mutex *lock, int print_owner) +-{ +- if (lock->name) +- printk(" [%p] {%s}\n", +- lock, lock->name); +- else +- printk(" [%p] {%s:%d}\n", +- lock, lock->file, lock->line); +- +- if (print_owner && rt_mutex_owner(lock)) { +- printk(".. ->owner: %p\n", lock->owner); +- printk(".. held by: "); +- printk_task(rt_mutex_owner(lock)); +- printk("\n"); +- } +-} +- + void rt_mutex_debug_task_free(struct task_struct *task) + { + DEBUG_LOCKS_WARN_ON(!RB_EMPTY_ROOT(&task->pi_waiters.rb_root)); + DEBUG_LOCKS_WARN_ON(task->pi_blocked_on); + } + +-/* +- * We fill out the fields in the waiter to store the information about +- * the deadlock. We print when we return. act_waiter can be NULL in +- * case of a remove waiter operation. +- */ +-void debug_rt_mutex_deadlock(enum rtmutex_chainwalk chwalk, +- struct rt_mutex_waiter *act_waiter, +- struct rt_mutex *lock) +-{ +- struct task_struct *task; +- +- if (!debug_locks || chwalk == RT_MUTEX_FULL_CHAINWALK || !act_waiter) +- return; +- +- task = rt_mutex_owner(act_waiter->lock); +- if (task && task != current) { +- act_waiter->deadlock_task_pid = get_pid(task_pid(task)); +- act_waiter->deadlock_lock = lock; +- } +-} +- +-void debug_rt_mutex_print_deadlock(struct rt_mutex_waiter *waiter) +-{ +- struct task_struct *task; +- +- if (!waiter->deadlock_lock || !debug_locks) +- return; +- +- rcu_read_lock(); +- task = pid_task(waiter->deadlock_task_pid, PIDTYPE_PID); +- if (!task) { +- rcu_read_unlock(); +- return; +- } +- +- if (!debug_locks_off()) { +- rcu_read_unlock(); +- return; +- } +- +- pr_warn("\n"); +- pr_warn("============================================\n"); +- pr_warn("WARNING: circular locking deadlock detected!\n"); +- pr_warn("%s\n", print_tainted()); +- pr_warn("--------------------------------------------\n"); +- printk("%s/%d is deadlocking current task %s/%d\n\n", +- task->comm, task_pid_nr(task), +- current->comm, task_pid_nr(current)); +- +- printk("\n1) %s/%d is trying to acquire this lock:\n", +- current->comm, task_pid_nr(current)); +- printk_lock(waiter->lock, 1); +- +- printk("\n2) %s/%d is blocked on this lock:\n", +- task->comm, task_pid_nr(task)); +- printk_lock(waiter->deadlock_lock, 1); +- +- debug_show_held_locks(current); +- debug_show_held_locks(task); +- +- printk("\n%s/%d's [blocked] stackdump:\n\n", +- task->comm, task_pid_nr(task)); +- show_stack(task, NULL, KERN_DEFAULT); +- printk("\n%s/%d's [current] stackdump:\n\n", +- current->comm, task_pid_nr(current)); +- dump_stack(); +- debug_show_all_locks(); +- rcu_read_unlock(); +- +- printk("[ turning off deadlock detection." +- "Please report this trace. ]\n\n"); +-} +- + void debug_rt_mutex_lock(struct rt_mutex *lock) + { + } +@@ -158,12 +60,10 @@ void debug_rt_mutex_proxy_unlock(struct rt_mutex *lock) + void debug_rt_mutex_init_waiter(struct rt_mutex_waiter *waiter) + { + memset(waiter, 0x11, sizeof(*waiter)); +- waiter->deadlock_task_pid = NULL; + } + + void debug_rt_mutex_free_waiter(struct rt_mutex_waiter *waiter) + { +- put_pid(waiter->deadlock_task_pid); + memset(waiter, 0x22, sizeof(*waiter)); + } + +@@ -173,10 +73,8 @@ void debug_rt_mutex_init(struct rt_mutex *lock, const char *name, struct lock_cl + * Make sure we are not reinitializing a held lock: + */ + debug_check_no_locks_freed((void *)lock, sizeof(*lock)); +- lock->name = name; + + #ifdef CONFIG_DEBUG_LOCK_ALLOC + lockdep_init_map(&lock->dep_map, name, key, 0); + #endif + } +- +diff --git a/kernel/locking/rtmutex-debug.h b/kernel/locking/rtmutex-debug.h +index fc549713b..659e93e25 100644 +--- a/kernel/locking/rtmutex-debug.h ++++ b/kernel/locking/rtmutex-debug.h +@@ -18,20 +18,9 @@ extern void debug_rt_mutex_unlock(struct rt_mutex *lock); + extern void debug_rt_mutex_proxy_lock(struct rt_mutex *lock, + struct task_struct *powner); + extern void debug_rt_mutex_proxy_unlock(struct rt_mutex *lock); +-extern void debug_rt_mutex_deadlock(enum rtmutex_chainwalk chwalk, +- struct rt_mutex_waiter *waiter, +- struct rt_mutex *lock); +-extern void debug_rt_mutex_print_deadlock(struct rt_mutex_waiter *waiter); +-# define debug_rt_mutex_reset_waiter(w) \ +- do { (w)->deadlock_lock = NULL; } while (0) + + static inline bool debug_rt_mutex_detect_deadlock(struct rt_mutex_waiter *waiter, + enum rtmutex_chainwalk walk) + { + return (waiter != NULL); + } +- +-static inline void rt_mutex_print_deadlock(struct rt_mutex_waiter *w) +-{ +- debug_rt_mutex_print_deadlock(w); +-} +diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c +index 2f8cd616d..58ea33097 100644 +--- a/kernel/locking/rtmutex.c ++++ b/kernel/locking/rtmutex.c +@@ -8,6 +8,11 @@ + * Copyright (C) 2005-2006 Timesys Corp., Thomas Gleixner + * Copyright (C) 2005 Kihon Technologies Inc., Steven Rostedt + * Copyright (C) 2006 Esben Nielsen ++ * Adaptive Spinlocks: ++ * Copyright (C) 2008 Novell, Inc., Gregory Haskins, Sven Dietrich, ++ * and Peter Morreale, ++ * Adaptive Spinlocks simplification: ++ * Copyright (C) 2008 Red Hat, Inc., Steven Rostedt + * + * See Documentation/locking/rt-mutex-design.rst for details. + */ +@@ -19,6 +24,7 @@ + #include + #include + #include ++#include + + #include "rtmutex_common.h" + +@@ -136,6 +142,12 @@ static void fixup_rt_mutex_waiters(struct rt_mutex *lock) + WRITE_ONCE(*p, owner & ~RT_MUTEX_HAS_WAITERS); + } + ++static int rt_mutex_real_waiter(struct rt_mutex_waiter *waiter) ++{ ++ return waiter && waiter != PI_WAKEUP_INPROGRESS && ++ waiter != PI_REQUEUE_INPROGRESS; ++} ++ + /* + * We can speed up the acquire/release, if there's no debugging state to be + * set up. +@@ -227,7 +239,7 @@ static inline bool unlock_rt_mutex_safe(struct rt_mutex *lock, + * Only use with rt_mutex_waiter_{less,equal}() + */ + #define task_to_waiter(p) \ +- &(struct rt_mutex_waiter){ .prio = (p)->prio, .deadline = (p)->dl.deadline } ++ &(struct rt_mutex_waiter){ .prio = (p)->prio, .deadline = (p)->dl.deadline, .task = (p) } + + static inline int + rt_mutex_waiter_less(struct rt_mutex_waiter *left, +@@ -267,6 +279,27 @@ rt_mutex_waiter_equal(struct rt_mutex_waiter *left, + return 1; + } + ++#define STEAL_NORMAL 0 ++#define STEAL_LATERAL 1 ++ ++static inline int ++rt_mutex_steal(struct rt_mutex *lock, struct rt_mutex_waiter *waiter, int mode) ++{ ++ struct rt_mutex_waiter *top_waiter = rt_mutex_top_waiter(lock); ++ ++ if (waiter == top_waiter || rt_mutex_waiter_less(waiter, top_waiter)) ++ return 1; ++ ++ /* ++ * Note that RT tasks are excluded from lateral-steals ++ * to prevent the introduction of an unbounded latency. ++ */ ++ if (mode == STEAL_NORMAL || rt_task(waiter->task)) ++ return 0; ++ ++ return rt_mutex_waiter_equal(waiter, top_waiter); ++} ++ + static void + rt_mutex_enqueue(struct rt_mutex *lock, struct rt_mutex_waiter *waiter) + { +@@ -371,6 +404,14 @@ static bool rt_mutex_cond_detect_deadlock(struct rt_mutex_waiter *waiter, + return debug_rt_mutex_detect_deadlock(waiter, chwalk); + } + ++static void rt_mutex_wake_waiter(struct rt_mutex_waiter *waiter) ++{ ++ if (waiter->savestate) ++ wake_up_lock_sleeper(waiter->task); ++ else ++ wake_up_process(waiter->task); ++} ++ + /* + * Max number of times we'll walk the boosting chain: + */ +@@ -378,7 +419,8 @@ int max_lock_depth = 1024; + + static inline struct rt_mutex *task_blocked_on_lock(struct task_struct *p) + { +- return p->pi_blocked_on ? p->pi_blocked_on->lock : NULL; ++ return rt_mutex_real_waiter(p->pi_blocked_on) ? ++ p->pi_blocked_on->lock : NULL; + } + + /* +@@ -514,7 +556,7 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, + * reached or the state of the chain has changed while we + * dropped the locks. + */ +- if (!waiter) ++ if (!rt_mutex_real_waiter(waiter)) + goto out_unlock_pi; + + /* +@@ -597,7 +639,6 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, + * walk, we detected a deadlock. + */ + if (lock == orig_lock || rt_mutex_owner(lock) == top_task) { +- debug_rt_mutex_deadlock(chwalk, orig_waiter, lock); + raw_spin_unlock(&lock->wait_lock); + ret = -EDEADLK; + goto out_unlock_pi; +@@ -694,13 +735,16 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, + * follow here. This is the end of the chain we are walking. + */ + if (!rt_mutex_owner(lock)) { ++ struct rt_mutex_waiter *lock_top_waiter; ++ + /* + * If the requeue [7] above changed the top waiter, + * then we need to wake the new top waiter up to try + * to get the lock. + */ +- if (prerequeue_top_waiter != rt_mutex_top_waiter(lock)) +- wake_up_process(rt_mutex_top_waiter(lock)->task); ++ lock_top_waiter = rt_mutex_top_waiter(lock); ++ if (prerequeue_top_waiter != lock_top_waiter) ++ rt_mutex_wake_waiter(lock_top_waiter); + raw_spin_unlock_irq(&lock->wait_lock); + return 0; + } +@@ -801,9 +845,11 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, + * @task: The task which wants to acquire the lock + * @waiter: The waiter that is queued to the lock's wait tree if the + * callsite called task_blocked_on_lock(), otherwise NULL ++ * @mode: Lock steal mode (STEAL_NORMAL, STEAL_LATERAL) + */ +-static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, +- struct rt_mutex_waiter *waiter) ++static int __try_to_take_rt_mutex(struct rt_mutex *lock, ++ struct task_struct *task, ++ struct rt_mutex_waiter *waiter, int mode) + { + lockdep_assert_held(&lock->wait_lock); + +@@ -839,12 +885,11 @@ static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, + */ + if (waiter) { + /* +- * If waiter is not the highest priority waiter of +- * @lock, give up. ++ * If waiter is not the highest priority waiter of @lock, ++ * or its peer when lateral steal is allowed, give up. + */ +- if (waiter != rt_mutex_top_waiter(lock)) ++ if (!rt_mutex_steal(lock, waiter, mode)) + return 0; +- + /* + * We can acquire the lock. Remove the waiter from the + * lock waiters tree. +@@ -862,14 +907,12 @@ static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, + */ + if (rt_mutex_has_waiters(lock)) { + /* +- * If @task->prio is greater than or equal to +- * the top waiter priority (kernel view), +- * @task lost. ++ * If @task->prio is greater than the top waiter ++ * priority (kernel view), or equal to it when a ++ * lateral steal is forbidden, @task lost. + */ +- if (!rt_mutex_waiter_less(task_to_waiter(task), +- rt_mutex_top_waiter(lock))) ++ if (!rt_mutex_steal(lock, task_to_waiter(task), mode)) + return 0; +- + /* + * The current top waiter stays enqueued. We + * don't have to change anything in the lock +@@ -916,6 +959,329 @@ static int try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, + return 1; + } + ++#ifdef CONFIG_PREEMPT_RT ++/* ++ * preemptible spin_lock functions: ++ */ ++static inline void rt_spin_lock_fastlock(struct rt_mutex *lock, ++ void (*slowfn)(struct rt_mutex *lock)) ++{ ++ might_sleep_no_state_check(); ++ ++ if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) ++ return; ++ else ++ slowfn(lock); ++} ++ ++static inline void rt_spin_lock_fastunlock(struct rt_mutex *lock, ++ void (*slowfn)(struct rt_mutex *lock)) ++{ ++ if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) ++ return; ++ else ++ slowfn(lock); ++} ++#ifdef CONFIG_SMP ++/* ++ * Note that owner is a speculative pointer and dereferencing relies ++ * on rcu_read_lock() and the check against the lock owner. ++ */ ++static int adaptive_wait(struct rt_mutex *lock, ++ struct task_struct *owner) ++{ ++ int res = 0; ++ ++ rcu_read_lock(); ++ for (;;) { ++ if (owner != rt_mutex_owner(lock)) ++ break; ++ /* ++ * Ensure that owner->on_cpu is dereferenced _after_ ++ * checking the above to be valid. ++ */ ++ barrier(); ++ if (!owner->on_cpu) { ++ res = 1; ++ break; ++ } ++ cpu_relax(); ++ } ++ rcu_read_unlock(); ++ return res; ++} ++#else ++static int adaptive_wait(struct rt_mutex *lock, ++ struct task_struct *orig_owner) ++{ ++ return 1; ++} ++#endif ++ ++static int task_blocks_on_rt_mutex(struct rt_mutex *lock, ++ struct rt_mutex_waiter *waiter, ++ struct task_struct *task, ++ enum rtmutex_chainwalk chwalk); ++/* ++ * Slow path lock function spin_lock style: this variant is very ++ * careful not to miss any non-lock wakeups. ++ * ++ * We store the current state under p->pi_lock in p->saved_state and ++ * the try_to_wake_up() code handles this accordingly. ++ */ ++void __sched rt_spin_lock_slowlock_locked(struct rt_mutex *lock, ++ struct rt_mutex_waiter *waiter, ++ unsigned long flags) ++{ ++ struct task_struct *lock_owner, *self = current; ++ struct rt_mutex_waiter *top_waiter; ++ int ret; ++ ++ if (__try_to_take_rt_mutex(lock, self, NULL, STEAL_LATERAL)) ++ return; ++ ++ BUG_ON(rt_mutex_owner(lock) == self); ++ ++ /* ++ * We save whatever state the task is in and we'll restore it ++ * after acquiring the lock taking real wakeups into account ++ * as well. We are serialized via pi_lock against wakeups. See ++ * try_to_wake_up(). ++ */ ++ raw_spin_lock(&self->pi_lock); ++ self->saved_state = self->state; ++ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); ++ raw_spin_unlock(&self->pi_lock); ++ ++ ret = task_blocks_on_rt_mutex(lock, waiter, self, RT_MUTEX_MIN_CHAINWALK); ++ BUG_ON(ret); ++ ++ for (;;) { ++ /* Try to acquire the lock again. */ ++ if (__try_to_take_rt_mutex(lock, self, waiter, STEAL_LATERAL)) ++ break; ++ ++ top_waiter = rt_mutex_top_waiter(lock); ++ lock_owner = rt_mutex_owner(lock); ++ ++ raw_spin_unlock_irqrestore(&lock->wait_lock, flags); ++ ++ if (top_waiter != waiter || adaptive_wait(lock, lock_owner)) ++ preempt_schedule_lock(); ++ ++ raw_spin_lock_irqsave(&lock->wait_lock, flags); ++ ++ raw_spin_lock(&self->pi_lock); ++ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); ++ raw_spin_unlock(&self->pi_lock); ++ } ++ ++ /* ++ * Restore the task state to current->saved_state. We set it ++ * to the original state above and the try_to_wake_up() code ++ * has possibly updated it when a real (non-rtmutex) wakeup ++ * happened while we were blocked. Clear saved_state so ++ * try_to_wakeup() does not get confused. ++ */ ++ raw_spin_lock(&self->pi_lock); ++ __set_current_state_no_track(self->saved_state); ++ self->saved_state = TASK_RUNNING; ++ raw_spin_unlock(&self->pi_lock); ++ ++ /* ++ * try_to_take_rt_mutex() sets the waiter bit ++ * unconditionally. We might have to fix that up: ++ */ ++ fixup_rt_mutex_waiters(lock); ++ ++ BUG_ON(rt_mutex_has_waiters(lock) && waiter == rt_mutex_top_waiter(lock)); ++ BUG_ON(!RB_EMPTY_NODE(&waiter->tree_entry)); ++} ++ ++static void noinline __sched rt_spin_lock_slowlock(struct rt_mutex *lock) ++{ ++ struct rt_mutex_waiter waiter; ++ unsigned long flags; ++ ++ rt_mutex_init_waiter(&waiter, true); ++ ++ raw_spin_lock_irqsave(&lock->wait_lock, flags); ++ rt_spin_lock_slowlock_locked(lock, &waiter, flags); ++ raw_spin_unlock_irqrestore(&lock->wait_lock, flags); ++ debug_rt_mutex_free_waiter(&waiter); ++} ++ ++static bool __sched __rt_mutex_unlock_common(struct rt_mutex *lock, ++ struct wake_q_head *wake_q, ++ struct wake_q_head *wq_sleeper); ++/* ++ * Slow path to release a rt_mutex spin_lock style ++ */ ++void __sched rt_spin_lock_slowunlock(struct rt_mutex *lock) ++{ ++ unsigned long flags; ++ DEFINE_WAKE_Q(wake_q); ++ DEFINE_WAKE_Q(wake_sleeper_q); ++ bool postunlock; ++ ++ raw_spin_lock_irqsave(&lock->wait_lock, flags); ++ postunlock = __rt_mutex_unlock_common(lock, &wake_q, &wake_sleeper_q); ++ raw_spin_unlock_irqrestore(&lock->wait_lock, flags); ++ ++ if (postunlock) ++ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); ++} ++ ++void __lockfunc rt_spin_lock(spinlock_t *lock) ++{ ++ spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); ++ rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); ++ rcu_read_lock(); ++ migrate_disable(); ++} ++EXPORT_SYMBOL(rt_spin_lock); ++ ++void __lockfunc __rt_spin_lock(struct rt_mutex *lock) ++{ ++ rt_spin_lock_fastlock(lock, rt_spin_lock_slowlock); ++} ++ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++void __lockfunc rt_spin_lock_nested(spinlock_t *lock, int subclass) ++{ ++ spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); ++ rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); ++ rcu_read_lock(); ++ migrate_disable(); ++} ++EXPORT_SYMBOL(rt_spin_lock_nested); ++ ++void __lockfunc rt_spin_lock_nest_lock(spinlock_t *lock, ++ struct lockdep_map *nest_lock) ++{ ++ spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_); ++ rt_spin_lock_fastlock(&lock->lock, rt_spin_lock_slowlock); ++ rcu_read_lock(); ++ migrate_disable(); ++} ++EXPORT_SYMBOL(rt_spin_lock_nest_lock); ++#endif ++ ++void __lockfunc rt_spin_unlock(spinlock_t *lock) ++{ ++ /* NOTE: we always pass in '1' for nested, for simplicity */ ++ spin_release(&lock->dep_map, _RET_IP_); ++ migrate_enable(); ++ rcu_read_unlock(); ++ rt_spin_lock_fastunlock(&lock->lock, rt_spin_lock_slowunlock); ++} ++EXPORT_SYMBOL(rt_spin_unlock); ++ ++void __lockfunc __rt_spin_unlock(struct rt_mutex *lock) ++{ ++ rt_spin_lock_fastunlock(lock, rt_spin_lock_slowunlock); ++} ++EXPORT_SYMBOL(__rt_spin_unlock); ++ ++/* ++ * Wait for the lock to get unlocked: instead of polling for an unlock ++ * (like raw spinlocks do), we lock and unlock, to force the kernel to ++ * schedule if there's contention: ++ */ ++void __lockfunc rt_spin_lock_unlock(spinlock_t *lock) ++{ ++ spin_lock(lock); ++ spin_unlock(lock); ++} ++EXPORT_SYMBOL(rt_spin_lock_unlock); ++ ++int __lockfunc rt_spin_trylock(spinlock_t *lock) ++{ ++ int ret; ++ ++ ret = __rt_mutex_trylock(&lock->lock); ++ if (ret) { ++ spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); ++ rcu_read_lock(); ++ migrate_disable(); ++ } ++ return ret; ++} ++EXPORT_SYMBOL(rt_spin_trylock); ++ ++int __lockfunc rt_spin_trylock_bh(spinlock_t *lock) ++{ ++ int ret; ++ ++ local_bh_disable(); ++ ret = __rt_mutex_trylock(&lock->lock); ++ if (ret) { ++ spin_acquire(&lock->dep_map, 0, 1, _RET_IP_); ++ rcu_read_lock(); ++ migrate_disable(); ++ } else { ++ local_bh_enable(); ++ } ++ return ret; ++} ++EXPORT_SYMBOL(rt_spin_trylock_bh); ++ ++void ++__rt_spin_lock_init(spinlock_t *lock, const char *name, struct lock_class_key *key) ++{ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ /* ++ * Make sure we are not reinitializing a held lock: ++ */ ++ debug_check_no_locks_freed((void *)lock, sizeof(*lock)); ++ lockdep_init_map(&lock->dep_map, name, key, 0); ++#endif ++} ++EXPORT_SYMBOL(__rt_spin_lock_init); ++ ++#endif /* PREEMPT_RT */ ++ ++#ifdef CONFIG_PREEMPT_RT ++ static inline int __sched ++__mutex_lock_check_stamp(struct rt_mutex *lock, struct ww_acquire_ctx *ctx) ++{ ++ struct ww_mutex *ww = container_of(lock, struct ww_mutex, base.lock); ++ struct ww_acquire_ctx *hold_ctx = READ_ONCE(ww->ctx); ++ ++ if (!hold_ctx) ++ return 0; ++ ++ if (unlikely(ctx == hold_ctx)) ++ return -EALREADY; ++ ++ if (ctx->stamp - hold_ctx->stamp <= LONG_MAX && ++ (ctx->stamp != hold_ctx->stamp || ctx > hold_ctx)) { ++#ifdef CONFIG_DEBUG_MUTEXES ++ DEBUG_LOCKS_WARN_ON(ctx->contending_lock); ++ ctx->contending_lock = ww; ++#endif ++ return -EDEADLK; ++ } ++ ++ return 0; ++} ++#else ++ static inline int __sched ++__mutex_lock_check_stamp(struct rt_mutex *lock, struct ww_acquire_ctx *ctx) ++{ ++ BUG(); ++ return 0; ++} ++ ++#endif ++ ++static inline int ++try_to_take_rt_mutex(struct rt_mutex *lock, struct task_struct *task, ++ struct rt_mutex_waiter *waiter) ++{ ++ return __try_to_take_rt_mutex(lock, task, waiter, STEAL_NORMAL); ++} ++ + /* + * Task blocks on lock. + * +@@ -948,6 +1314,22 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, + return -EDEADLK; + + raw_spin_lock(&task->pi_lock); ++ /* ++ * In the case of futex requeue PI, this will be a proxy ++ * lock. The task will wake unaware that it is enqueueed on ++ * this lock. Avoid blocking on two locks and corrupting ++ * pi_blocked_on via the PI_WAKEUP_INPROGRESS ++ * flag. futex_wait_requeue_pi() sets this when it wakes up ++ * before requeue (due to a signal or timeout). Do not enqueue ++ * the task if PI_WAKEUP_INPROGRESS is set. ++ */ ++ if (task != current && task->pi_blocked_on == PI_WAKEUP_INPROGRESS) { ++ raw_spin_unlock(&task->pi_lock); ++ return -EAGAIN; ++ } ++ ++ BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)); ++ + waiter->task = task; + waiter->lock = lock; + waiter->prio = task->prio; +@@ -971,7 +1353,7 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, + rt_mutex_enqueue_pi(owner, waiter); + + rt_mutex_adjust_prio(owner); +- if (owner->pi_blocked_on) ++ if (rt_mutex_real_waiter(owner->pi_blocked_on)) + chain_walk = 1; + } else if (rt_mutex_cond_detect_deadlock(waiter, chwalk)) { + chain_walk = 1; +@@ -1013,6 +1395,7 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, + * Called with lock->wait_lock held and interrupts disabled. + */ + static void mark_wakeup_next_waiter(struct wake_q_head *wake_q, ++ struct wake_q_head *wake_sleeper_q, + struct rt_mutex *lock) + { + struct rt_mutex_waiter *waiter; +@@ -1052,7 +1435,10 @@ static void mark_wakeup_next_waiter(struct wake_q_head *wake_q, + * Pairs with preempt_enable() in rt_mutex_postunlock(); + */ + preempt_disable(); +- wake_q_add(wake_q, waiter->task); ++ if (waiter->savestate) ++ wake_q_add_sleeper(wake_sleeper_q, waiter->task); ++ else ++ wake_q_add(wake_q, waiter->task); + raw_spin_unlock(¤t->pi_lock); + } + +@@ -1067,7 +1453,7 @@ static void remove_waiter(struct rt_mutex *lock, + { + bool is_top_waiter = (waiter == rt_mutex_top_waiter(lock)); + struct task_struct *owner = rt_mutex_owner(lock); +- struct rt_mutex *next_lock; ++ struct rt_mutex *next_lock = NULL; + + lockdep_assert_held(&lock->wait_lock); + +@@ -1093,7 +1479,8 @@ static void remove_waiter(struct rt_mutex *lock, + rt_mutex_adjust_prio(owner); + + /* Store the lock on which owner is blocked or NULL */ +- next_lock = task_blocked_on_lock(owner); ++ if (rt_mutex_real_waiter(owner->pi_blocked_on)) ++ next_lock = task_blocked_on_lock(owner); + + raw_spin_unlock(&owner->pi_lock); + +@@ -1129,26 +1516,28 @@ void rt_mutex_adjust_pi(struct task_struct *task) + raw_spin_lock_irqsave(&task->pi_lock, flags); + + waiter = task->pi_blocked_on; +- if (!waiter || rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { ++ if (!rt_mutex_real_waiter(waiter) || ++ rt_mutex_waiter_equal(waiter, task_to_waiter(task))) { + raw_spin_unlock_irqrestore(&task->pi_lock, flags); + return; + } + next_lock = waiter->lock; +- raw_spin_unlock_irqrestore(&task->pi_lock, flags); + + /* gets dropped in rt_mutex_adjust_prio_chain()! */ + get_task_struct(task); + ++ raw_spin_unlock_irqrestore(&task->pi_lock, flags); + rt_mutex_adjust_prio_chain(task, RT_MUTEX_MIN_CHAINWALK, NULL, + next_lock, NULL, task); + } + +-void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter) ++void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savestate) + { + debug_rt_mutex_init_waiter(waiter); + RB_CLEAR_NODE(&waiter->pi_tree_entry); + RB_CLEAR_NODE(&waiter->tree_entry); + waiter->task = NULL; ++ waiter->savestate = savestate; + } + + /** +@@ -1164,7 +1553,8 @@ void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter) + static int __sched + __rt_mutex_slowlock(struct rt_mutex *lock, int state, + struct hrtimer_sleeper *timeout, +- struct rt_mutex_waiter *waiter) ++ struct rt_mutex_waiter *waiter, ++ struct ww_acquire_ctx *ww_ctx) + { + int ret = 0; + +@@ -1173,24 +1563,23 @@ __rt_mutex_slowlock(struct rt_mutex *lock, int state, + if (try_to_take_rt_mutex(lock, current, waiter)) + break; + +- /* +- * TASK_INTERRUPTIBLE checks for signals and +- * timeout. Ignored otherwise. +- */ +- if (likely(state == TASK_INTERRUPTIBLE)) { +- /* Signal pending? */ +- if (signal_pending(current)) +- ret = -EINTR; +- if (timeout && !timeout->task) +- ret = -ETIMEDOUT; ++ if (timeout && !timeout->task) { ++ ret = -ETIMEDOUT; ++ break; ++ } ++ if (signal_pending_state(state, current)) { ++ ret = -EINTR; ++ break; ++ } ++ ++ if (ww_ctx && ww_ctx->acquired > 0) { ++ ret = __mutex_lock_check_stamp(lock, ww_ctx); + if (ret) + break; + } + + raw_spin_unlock_irq(&lock->wait_lock); + +- debug_rt_mutex_print_deadlock(waiter); +- + schedule(); + + raw_spin_lock_irq(&lock->wait_lock); +@@ -1211,43 +1600,110 @@ static void rt_mutex_handle_deadlock(int res, int detect_deadlock, + if (res != -EDEADLOCK || detect_deadlock) + return; + +- /* +- * Yell lowdly and stop the task right here. +- */ +- rt_mutex_print_deadlock(w); + while (1) { + set_current_state(TASK_INTERRUPTIBLE); + schedule(); + } + } + +-/* +- * Slow path lock function: +- */ +-static int __sched +-rt_mutex_slowlock(struct rt_mutex *lock, int state, +- struct hrtimer_sleeper *timeout, +- enum rtmutex_chainwalk chwalk) ++static __always_inline void ww_mutex_lock_acquired(struct ww_mutex *ww, ++ struct ww_acquire_ctx *ww_ctx) + { +- struct rt_mutex_waiter waiter; +- unsigned long flags; +- int ret = 0; ++#ifdef CONFIG_DEBUG_MUTEXES ++ /* ++ * If this WARN_ON triggers, you used ww_mutex_lock to acquire, ++ * but released with a normal mutex_unlock in this call. ++ * ++ * This should never happen, always use ww_mutex_unlock. ++ */ ++ DEBUG_LOCKS_WARN_ON(ww->ctx); ++ ++ /* ++ * Not quite done after calling ww_acquire_done() ? ++ */ ++ DEBUG_LOCKS_WARN_ON(ww_ctx->done_acquire); + +- rt_mutex_init_waiter(&waiter); ++ if (ww_ctx->contending_lock) { ++ /* ++ * After -EDEADLK you tried to ++ * acquire a different ww_mutex? Bad! ++ */ ++ DEBUG_LOCKS_WARN_ON(ww_ctx->contending_lock != ww); ++ ++ /* ++ * You called ww_mutex_lock after receiving -EDEADLK, ++ * but 'forgot' to unlock everything else first? ++ */ ++ DEBUG_LOCKS_WARN_ON(ww_ctx->acquired > 0); ++ ww_ctx->contending_lock = NULL; ++ } + + /* +- * Technically we could use raw_spin_[un]lock_irq() here, but this can +- * be called in early boot if the cmpxchg() fast path is disabled +- * (debug, no architecture support). In this case we will acquire the +- * rtmutex with lock->wait_lock held. But we cannot unconditionally +- * enable interrupts in that early boot case. So we need to use the +- * irqsave/restore variants. ++ * Naughty, using a different class will lead to undefined behavior! + */ +- raw_spin_lock_irqsave(&lock->wait_lock, flags); ++ DEBUG_LOCKS_WARN_ON(ww_ctx->ww_class != ww->ww_class); ++#endif ++ ww_ctx->acquired++; ++} ++ ++#ifdef CONFIG_PREEMPT_RT ++static void ww_mutex_account_lock(struct rt_mutex *lock, ++ struct ww_acquire_ctx *ww_ctx) ++{ ++ struct ww_mutex *ww = container_of(lock, struct ww_mutex, base.lock); ++ struct rt_mutex_waiter *waiter, *n; ++ ++ /* ++ * This branch gets optimized out for the common case, ++ * and is only important for ww_mutex_lock. ++ */ ++ ww_mutex_lock_acquired(ww, ww_ctx); ++ ww->ctx = ww_ctx; ++ ++ /* ++ * Give any possible sleeping processes the chance to wake up, ++ * so they can recheck if they have to back off. ++ */ ++ rbtree_postorder_for_each_entry_safe(waiter, n, &lock->waiters.rb_root, ++ tree_entry) { ++ /* XXX debug rt mutex waiter wakeup */ ++ ++ BUG_ON(waiter->lock != lock); ++ rt_mutex_wake_waiter(waiter); ++ } ++} ++ ++#else ++ ++static void ww_mutex_account_lock(struct rt_mutex *lock, ++ struct ww_acquire_ctx *ww_ctx) ++{ ++ BUG(); ++} ++#endif ++ ++int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, ++ struct hrtimer_sleeper *timeout, ++ enum rtmutex_chainwalk chwalk, ++ struct ww_acquire_ctx *ww_ctx, ++ struct rt_mutex_waiter *waiter) ++{ ++ int ret; ++ ++#ifdef CONFIG_PREEMPT_RT ++ if (ww_ctx) { ++ struct ww_mutex *ww; ++ ++ ww = container_of(lock, struct ww_mutex, base.lock); ++ if (unlikely(ww_ctx == READ_ONCE(ww->ctx))) ++ return -EALREADY; ++ } ++#endif + + /* Try to acquire the lock again: */ + if (try_to_take_rt_mutex(lock, current, NULL)) { +- raw_spin_unlock_irqrestore(&lock->wait_lock, flags); ++ if (ww_ctx) ++ ww_mutex_account_lock(lock, ww_ctx); + return 0; + } + +@@ -1257,16 +1713,26 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, + if (unlikely(timeout)) + hrtimer_start_expires(&timeout->timer, HRTIMER_MODE_ABS); + +- ret = task_blocks_on_rt_mutex(lock, &waiter, current, chwalk); ++ ret = task_blocks_on_rt_mutex(lock, waiter, current, chwalk); + +- if (likely(!ret)) ++ if (likely(!ret)) { + /* sleep on the mutex */ +- ret = __rt_mutex_slowlock(lock, state, timeout, &waiter); ++ ret = __rt_mutex_slowlock(lock, state, timeout, waiter, ++ ww_ctx); ++ } else if (ww_ctx) { ++ /* ww_mutex received EDEADLK, let it become EALREADY */ ++ ret = __mutex_lock_check_stamp(lock, ww_ctx); ++ BUG_ON(!ret); ++ } + + if (unlikely(ret)) { + __set_current_state(TASK_RUNNING); +- remove_waiter(lock, &waiter); +- rt_mutex_handle_deadlock(ret, chwalk, &waiter); ++ remove_waiter(lock, waiter); ++ /* ww_mutex wants to report EDEADLK/EALREADY, let it */ ++ if (!ww_ctx) ++ rt_mutex_handle_deadlock(ret, chwalk, waiter); ++ } else if (ww_ctx) { ++ ww_mutex_account_lock(lock, ww_ctx); + } + + /* +@@ -1274,6 +1740,36 @@ rt_mutex_slowlock(struct rt_mutex *lock, int state, + * unconditionally. We might have to fix that up. + */ + fixup_rt_mutex_waiters(lock); ++ return ret; ++} ++ ++/* ++ * Slow path lock function: ++ */ ++static int __sched ++rt_mutex_slowlock(struct rt_mutex *lock, int state, ++ struct hrtimer_sleeper *timeout, ++ enum rtmutex_chainwalk chwalk, ++ struct ww_acquire_ctx *ww_ctx) ++{ ++ struct rt_mutex_waiter waiter; ++ unsigned long flags; ++ int ret = 0; ++ ++ rt_mutex_init_waiter(&waiter, false); ++ ++ /* ++ * Technically we could use raw_spin_[un]lock_irq() here, but this can ++ * be called in early boot if the cmpxchg() fast path is disabled ++ * (debug, no architecture support). In this case we will acquire the ++ * rtmutex with lock->wait_lock held. But we cannot unconditionally ++ * enable interrupts in that early boot case. So we need to use the ++ * irqsave/restore variants. ++ */ ++ raw_spin_lock_irqsave(&lock->wait_lock, flags); ++ ++ ret = rt_mutex_slowlock_locked(lock, state, timeout, chwalk, ww_ctx, ++ &waiter); + + raw_spin_unlock_irqrestore(&lock->wait_lock, flags); + +@@ -1334,7 +1830,8 @@ static inline int rt_mutex_slowtrylock(struct rt_mutex *lock) + * Return whether the current task needs to call rt_mutex_postunlock(). + */ + static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, +- struct wake_q_head *wake_q) ++ struct wake_q_head *wake_q, ++ struct wake_q_head *wake_sleeper_q) + { + unsigned long flags; + +@@ -1388,7 +1885,7 @@ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, + * + * Queue the next waiter for wakeup once we release the wait_lock. + */ +- mark_wakeup_next_waiter(wake_q, lock); ++ mark_wakeup_next_waiter(wake_q, wake_sleeper_q, lock); + raw_spin_unlock_irqrestore(&lock->wait_lock, flags); + + return true; /* call rt_mutex_postunlock() */ +@@ -1402,29 +1899,16 @@ static bool __sched rt_mutex_slowunlock(struct rt_mutex *lock, + */ + static inline int + rt_mutex_fastlock(struct rt_mutex *lock, int state, ++ struct ww_acquire_ctx *ww_ctx, + int (*slowfn)(struct rt_mutex *lock, int state, + struct hrtimer_sleeper *timeout, +- enum rtmutex_chainwalk chwalk)) ++ enum rtmutex_chainwalk chwalk, ++ struct ww_acquire_ctx *ww_ctx)) + { + if (likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) + return 0; + +- return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK); +-} +- +-static inline int +-rt_mutex_timed_fastlock(struct rt_mutex *lock, int state, +- struct hrtimer_sleeper *timeout, +- enum rtmutex_chainwalk chwalk, +- int (*slowfn)(struct rt_mutex *lock, int state, +- struct hrtimer_sleeper *timeout, +- enum rtmutex_chainwalk chwalk)) +-{ +- if (chwalk == RT_MUTEX_MIN_CHAINWALK && +- likely(rt_mutex_cmpxchg_acquire(lock, NULL, current))) +- return 0; +- +- return slowfn(lock, state, timeout, chwalk); ++ return slowfn(lock, state, NULL, RT_MUTEX_MIN_CHAINWALK, ww_ctx); + } + + static inline int +@@ -1440,9 +1924,11 @@ rt_mutex_fasttrylock(struct rt_mutex *lock, + /* + * Performs the wakeup of the the top-waiter and re-enables preemption. + */ +-void rt_mutex_postunlock(struct wake_q_head *wake_q) ++void rt_mutex_postunlock(struct wake_q_head *wake_q, ++ struct wake_q_head *wake_sleeper_q) + { + wake_up_q(wake_q); ++ wake_up_q_sleeper(wake_sleeper_q); + + /* Pairs with preempt_disable() in rt_mutex_slowunlock() */ + preempt_enable(); +@@ -1451,23 +1937,46 @@ void rt_mutex_postunlock(struct wake_q_head *wake_q) + static inline void + rt_mutex_fastunlock(struct rt_mutex *lock, + bool (*slowfn)(struct rt_mutex *lock, +- struct wake_q_head *wqh)) ++ struct wake_q_head *wqh, ++ struct wake_q_head *wq_sleeper)) + { + DEFINE_WAKE_Q(wake_q); ++ DEFINE_WAKE_Q(wake_sleeper_q); + + if (likely(rt_mutex_cmpxchg_release(lock, current, NULL))) + return; + +- if (slowfn(lock, &wake_q)) +- rt_mutex_postunlock(&wake_q); ++ if (slowfn(lock, &wake_q, &wake_sleeper_q)) ++ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); + } + +-static inline void __rt_mutex_lock(struct rt_mutex *lock, unsigned int subclass) ++int __sched __rt_mutex_lock_state(struct rt_mutex *lock, int state) + { + might_sleep(); ++ return rt_mutex_fastlock(lock, state, NULL, rt_mutex_slowlock); ++} ++ ++/** ++ * rt_mutex_lock_state - lock a rt_mutex with a given state ++ * ++ * @lock: The rt_mutex to be locked ++ * @state: The state to set when blocking on the rt_mutex ++ */ ++static inline int __sched rt_mutex_lock_state(struct rt_mutex *lock, ++ unsigned int subclass, int state) ++{ ++ int ret; + + mutex_acquire(&lock->dep_map, subclass, 0, _RET_IP_); +- rt_mutex_fastlock(lock, TASK_UNINTERRUPTIBLE, rt_mutex_slowlock); ++ ret = __rt_mutex_lock_state(lock, state); ++ if (ret) ++ mutex_release(&lock->dep_map, _RET_IP_); ++ return ret; ++} ++ ++static inline void __rt_mutex_lock(struct rt_mutex *lock, unsigned int subclass) ++{ ++ rt_mutex_lock_state(lock, subclass, TASK_UNINTERRUPTIBLE); + } + + #ifdef CONFIG_DEBUG_LOCK_ALLOC +@@ -1508,16 +2017,7 @@ EXPORT_SYMBOL_GPL(rt_mutex_lock); + */ + int __sched rt_mutex_lock_interruptible(struct rt_mutex *lock) + { +- int ret; +- +- might_sleep(); +- +- mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); +- ret = rt_mutex_fastlock(lock, TASK_INTERRUPTIBLE, rt_mutex_slowlock); +- if (ret) +- mutex_release(&lock->dep_map, _RET_IP_); +- +- return ret; ++ return rt_mutex_lock_state(lock, 0, TASK_INTERRUPTIBLE); + } + EXPORT_SYMBOL_GPL(rt_mutex_lock_interruptible); + +@@ -1534,36 +2034,17 @@ int __sched __rt_mutex_futex_trylock(struct rt_mutex *lock) + return __rt_mutex_slowtrylock(lock); + } + +-/** +- * rt_mutex_timed_lock - lock a rt_mutex interruptible +- * the timeout structure is provided +- * by the caller +- * +- * @lock: the rt_mutex to be locked +- * @timeout: timeout structure or NULL (no timeout) +- * +- * Returns: +- * 0 on success +- * -EINTR when interrupted by a signal +- * -ETIMEDOUT when the timeout expired +- */ +-int +-rt_mutex_timed_lock(struct rt_mutex *lock, struct hrtimer_sleeper *timeout) ++int __sched __rt_mutex_trylock(struct rt_mutex *lock) + { +- int ret; +- +- might_sleep(); +- +- mutex_acquire(&lock->dep_map, 0, 0, _RET_IP_); +- ret = rt_mutex_timed_fastlock(lock, TASK_INTERRUPTIBLE, timeout, +- RT_MUTEX_MIN_CHAINWALK, +- rt_mutex_slowlock); +- if (ret) +- mutex_release(&lock->dep_map, _RET_IP_); ++#ifdef CONFIG_PREEMPT_RT ++ if (WARN_ON_ONCE(in_irq() || in_nmi())) ++#else ++ if (WARN_ON_ONCE(in_irq() || in_nmi() || in_serving_softirq())) ++#endif ++ return 0; + +- return ret; ++ return rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock); + } +-EXPORT_SYMBOL_GPL(rt_mutex_timed_lock); + + /** + * rt_mutex_trylock - try to lock a rt_mutex +@@ -1580,10 +2061,7 @@ int __sched rt_mutex_trylock(struct rt_mutex *lock) + { + int ret; + +- if (WARN_ON_ONCE(in_irq() || in_nmi() || in_serving_softirq())) +- return 0; +- +- ret = rt_mutex_fasttrylock(lock, rt_mutex_slowtrylock); ++ ret = __rt_mutex_trylock(lock); + if (ret) + mutex_acquire(&lock->dep_map, 0, 1, _RET_IP_); + +@@ -1591,6 +2069,11 @@ int __sched rt_mutex_trylock(struct rt_mutex *lock) + } + EXPORT_SYMBOL_GPL(rt_mutex_trylock); + ++void __sched __rt_mutex_unlock(struct rt_mutex *lock) ++{ ++ rt_mutex_fastunlock(lock, rt_mutex_slowunlock); ++} ++ + /** + * rt_mutex_unlock - unlock a rt_mutex + * +@@ -1599,16 +2082,13 @@ EXPORT_SYMBOL_GPL(rt_mutex_trylock); + void __sched rt_mutex_unlock(struct rt_mutex *lock) + { + mutex_release(&lock->dep_map, _RET_IP_); +- rt_mutex_fastunlock(lock, rt_mutex_slowunlock); ++ __rt_mutex_unlock(lock); + } + EXPORT_SYMBOL_GPL(rt_mutex_unlock); + +-/** +- * Futex variant, that since futex variants do not use the fast-path, can be +- * simple and will not need to retry. +- */ +-bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock, +- struct wake_q_head *wake_q) ++static bool __sched __rt_mutex_unlock_common(struct rt_mutex *lock, ++ struct wake_q_head *wake_q, ++ struct wake_q_head *wq_sleeper) + { + lockdep_assert_held(&lock->wait_lock); + +@@ -1625,23 +2105,35 @@ bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock, + * avoid inversion prior to the wakeup. preempt_disable() + * therein pairs with rt_mutex_postunlock(). + */ +- mark_wakeup_next_waiter(wake_q, lock); ++ mark_wakeup_next_waiter(wake_q, wq_sleeper, lock); + + return true; /* call postunlock() */ + } + ++/** ++ * Futex variant, that since futex variants do not use the fast-path, can be ++ * simple and will not need to retry. ++ */ ++bool __sched __rt_mutex_futex_unlock(struct rt_mutex *lock, ++ struct wake_q_head *wake_q, ++ struct wake_q_head *wq_sleeper) ++{ ++ return __rt_mutex_unlock_common(lock, wake_q, wq_sleeper); ++} ++ + void __sched rt_mutex_futex_unlock(struct rt_mutex *lock) + { + DEFINE_WAKE_Q(wake_q); ++ DEFINE_WAKE_Q(wake_sleeper_q); + unsigned long flags; + bool postunlock; + + raw_spin_lock_irqsave(&lock->wait_lock, flags); +- postunlock = __rt_mutex_futex_unlock(lock, &wake_q); ++ postunlock = __rt_mutex_futex_unlock(lock, &wake_q, &wake_sleeper_q); + raw_spin_unlock_irqrestore(&lock->wait_lock, flags); + + if (postunlock) +- rt_mutex_postunlock(&wake_q); ++ rt_mutex_postunlock(&wake_q, &wake_sleeper_q); + } + + /** +@@ -1655,9 +2147,6 @@ void __sched rt_mutex_futex_unlock(struct rt_mutex *lock) + void rt_mutex_destroy(struct rt_mutex *lock) + { + WARN_ON(rt_mutex_is_locked(lock)); +-#ifdef CONFIG_DEBUG_RT_MUTEXES +- lock->magic = NULL; +-#endif + } + EXPORT_SYMBOL_GPL(rt_mutex_destroy); + +@@ -1680,7 +2169,7 @@ void __rt_mutex_init(struct rt_mutex *lock, const char *name, + if (name && key) + debug_rt_mutex_init(lock, name, key); + } +-EXPORT_SYMBOL_GPL(__rt_mutex_init); ++EXPORT_SYMBOL(__rt_mutex_init); + + /** + * rt_mutex_init_proxy_locked - initialize and lock a rt_mutex on behalf of a +@@ -1700,6 +2189,14 @@ void rt_mutex_init_proxy_locked(struct rt_mutex *lock, + struct task_struct *proxy_owner) + { + __rt_mutex_init(lock, NULL, NULL); ++#ifdef CONFIG_DEBUG_SPINLOCK ++ /* ++ * get another key class for the wait_lock. LOCK_PI and UNLOCK_PI is ++ * holding the ->wait_lock of the proxy_lock while unlocking a sleeping ++ * lock. ++ */ ++ raw_spin_lock_init(&lock->wait_lock); ++#endif + debug_rt_mutex_proxy_lock(lock, proxy_owner); + rt_mutex_set_owner(lock, proxy_owner); + } +@@ -1722,6 +2219,26 @@ void rt_mutex_proxy_unlock(struct rt_mutex *lock) + rt_mutex_set_owner(lock, NULL); + } + ++static void fixup_rt_mutex_blocked(struct rt_mutex *lock) ++{ ++ struct task_struct *tsk = current; ++ /* ++ * RT has a problem here when the wait got interrupted by a timeout ++ * or a signal. task->pi_blocked_on is still set. The task must ++ * acquire the hash bucket lock when returning from this function. ++ * ++ * If the hash bucket lock is contended then the ++ * BUG_ON(rt_mutex_real_waiter(task->pi_blocked_on)) in ++ * task_blocks_on_rt_mutex() will trigger. This can be avoided by ++ * clearing task->pi_blocked_on which removes the task from the ++ * boosting chain of the rtmutex. That's correct because the task ++ * is not longer blocked on it. ++ */ ++ raw_spin_lock(&tsk->pi_lock); ++ tsk->pi_blocked_on = NULL; ++ raw_spin_unlock(&tsk->pi_lock); ++} ++ + /** + * __rt_mutex_start_proxy_lock() - Start lock acquisition for another task + * @lock: the rt_mutex to take +@@ -1752,6 +2269,34 @@ int __rt_mutex_start_proxy_lock(struct rt_mutex *lock, + if (try_to_take_rt_mutex(lock, task, NULL)) + return 1; + ++#ifdef CONFIG_PREEMPT_RT ++ /* ++ * In PREEMPT_RT there's an added race. ++ * If the task, that we are about to requeue, times out, ++ * it can set the PI_WAKEUP_INPROGRESS. This tells the requeue ++ * to skip this task. But right after the task sets ++ * its pi_blocked_on to PI_WAKEUP_INPROGRESS it can then ++ * block on the spin_lock(&hb->lock), which in RT is an rtmutex. ++ * This will replace the PI_WAKEUP_INPROGRESS with the actual ++ * lock that it blocks on. We *must not* place this task ++ * on this proxy lock in that case. ++ * ++ * To prevent this race, we first take the task's pi_lock ++ * and check if it has updated its pi_blocked_on. If it has, ++ * we assume that it woke up and we return -EAGAIN. ++ * Otherwise, we set the task's pi_blocked_on to ++ * PI_REQUEUE_INPROGRESS, so that if the task is waking up ++ * it will know that we are in the process of requeuing it. ++ */ ++ raw_spin_lock(&task->pi_lock); ++ if (task->pi_blocked_on) { ++ raw_spin_unlock(&task->pi_lock); ++ return -EAGAIN; ++ } ++ task->pi_blocked_on = PI_REQUEUE_INPROGRESS; ++ raw_spin_unlock(&task->pi_lock); ++#endif ++ + /* We enforce deadlock detection for futexes */ + ret = task_blocks_on_rt_mutex(lock, waiter, task, + RT_MUTEX_FULL_CHAINWALK); +@@ -1766,7 +2311,8 @@ int __rt_mutex_start_proxy_lock(struct rt_mutex *lock, + ret = 0; + } + +- debug_rt_mutex_print_deadlock(waiter); ++ if (ret) ++ fixup_rt_mutex_blocked(lock); + + return ret; + } +@@ -1851,12 +2397,15 @@ int rt_mutex_wait_proxy_lock(struct rt_mutex *lock, + raw_spin_lock_irq(&lock->wait_lock); + /* sleep on the mutex */ + set_current_state(TASK_INTERRUPTIBLE); +- ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter); ++ ret = __rt_mutex_slowlock(lock, TASK_INTERRUPTIBLE, to, waiter, NULL); + /* + * try_to_take_rt_mutex() sets the waiter bit unconditionally. We might + * have to fix that up. + */ + fixup_rt_mutex_waiters(lock); ++ if (ret) ++ fixup_rt_mutex_blocked(lock); ++ + raw_spin_unlock_irq(&lock->wait_lock); + + return ret; +@@ -1918,3 +2467,97 @@ bool rt_mutex_cleanup_proxy_lock(struct rt_mutex *lock, + + return cleanup; + } ++ ++static inline int ++ww_mutex_deadlock_injection(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) ++{ ++#ifdef CONFIG_DEBUG_WW_MUTEX_SLOWPATH ++ unsigned int tmp; ++ ++ if (ctx->deadlock_inject_countdown-- == 0) { ++ tmp = ctx->deadlock_inject_interval; ++ if (tmp > UINT_MAX/4) ++ tmp = UINT_MAX; ++ else ++ tmp = tmp*2 + tmp + tmp/2; ++ ++ ctx->deadlock_inject_interval = tmp; ++ ctx->deadlock_inject_countdown = tmp; ++ ctx->contending_lock = lock; ++ ++ ww_mutex_unlock(lock); ++ ++ return -EDEADLK; ++ } ++#endif ++ ++ return 0; ++} ++ ++#ifdef CONFIG_PREEMPT_RT ++int __sched ++ww_mutex_lock_interruptible(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) ++{ ++ int ret; ++ ++ might_sleep(); ++ ++ mutex_acquire_nest(&lock->base.dep_map, 0, 0, ++ ctx ? &ctx->dep_map : NULL, _RET_IP_); ++ ret = rt_mutex_slowlock(&lock->base.lock, TASK_INTERRUPTIBLE, NULL, 0, ++ ctx); ++ if (ret) ++ mutex_release(&lock->base.dep_map, _RET_IP_); ++ else if (!ret && ctx && ctx->acquired > 1) ++ return ww_mutex_deadlock_injection(lock, ctx); ++ ++ return ret; ++} ++EXPORT_SYMBOL_GPL(ww_mutex_lock_interruptible); ++ ++int __sched ++ww_mutex_lock(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) ++{ ++ int ret; ++ ++ might_sleep(); ++ ++ mutex_acquire_nest(&lock->base.dep_map, 0, 0, ++ ctx ? &ctx->dep_map : NULL, _RET_IP_); ++ ret = rt_mutex_slowlock(&lock->base.lock, TASK_UNINTERRUPTIBLE, NULL, 0, ++ ctx); ++ if (ret) ++ mutex_release(&lock->base.dep_map, _RET_IP_); ++ else if (!ret && ctx && ctx->acquired > 1) ++ return ww_mutex_deadlock_injection(lock, ctx); ++ ++ return ret; ++} ++EXPORT_SYMBOL_GPL(ww_mutex_lock); ++ ++void __sched ww_mutex_unlock(struct ww_mutex *lock) ++{ ++ /* ++ * The unlocking fastpath is the 0->1 transition from 'locked' ++ * into 'unlocked' state: ++ */ ++ if (lock->ctx) { ++#ifdef CONFIG_DEBUG_MUTEXES ++ DEBUG_LOCKS_WARN_ON(!lock->ctx->acquired); ++#endif ++ if (lock->ctx->acquired > 0) ++ lock->ctx->acquired--; ++ lock->ctx = NULL; ++ } ++ ++ mutex_release(&lock->base.dep_map, _RET_IP_); ++ __rt_mutex_unlock(&lock->base.lock); ++} ++EXPORT_SYMBOL(ww_mutex_unlock); ++ ++int __rt_mutex_owner_current(struct rt_mutex *lock) ++{ ++ return rt_mutex_owner(lock) == current; ++} ++EXPORT_SYMBOL(__rt_mutex_owner_current); ++#endif +diff --git a/kernel/locking/rtmutex.h b/kernel/locking/rtmutex.h +index 732f96abf..338ccd291 100644 +--- a/kernel/locking/rtmutex.h ++++ b/kernel/locking/rtmutex.h +@@ -19,15 +19,8 @@ + #define debug_rt_mutex_proxy_unlock(l) do { } while (0) + #define debug_rt_mutex_unlock(l) do { } while (0) + #define debug_rt_mutex_init(m, n, k) do { } while (0) +-#define debug_rt_mutex_deadlock(d, a ,l) do { } while (0) +-#define debug_rt_mutex_print_deadlock(w) do { } while (0) + #define debug_rt_mutex_reset_waiter(w) do { } while (0) + +-static inline void rt_mutex_print_deadlock(struct rt_mutex_waiter *w) +-{ +- WARN(1, "rtmutex deadlock detected\n"); +-} +- + static inline bool debug_rt_mutex_detect_deadlock(struct rt_mutex_waiter *w, + enum rtmutex_chainwalk walk) + { +diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h +index ca6fb4890..248a7d915 100644 +--- a/kernel/locking/rtmutex_common.h ++++ b/kernel/locking/rtmutex_common.h +@@ -15,6 +15,7 @@ + + #include + #include ++#include + + /* + * This is the control structure for tasks blocked on a rt_mutex, +@@ -29,12 +30,8 @@ struct rt_mutex_waiter { + struct rb_node pi_tree_entry; + struct task_struct *task; + struct rt_mutex *lock; +-#ifdef CONFIG_DEBUG_RT_MUTEXES +- unsigned long ip; +- struct pid *deadlock_task_pid; +- struct rt_mutex *deadlock_lock; +-#endif + int prio; ++ bool savestate; + u64 deadline; + }; + +@@ -130,11 +127,14 @@ enum rtmutex_chainwalk { + /* + * PI-futex support (proxy locking functions, etc.): + */ ++#define PI_WAKEUP_INPROGRESS ((struct rt_mutex_waiter *) 1) ++#define PI_REQUEUE_INPROGRESS ((struct rt_mutex_waiter *) 2) ++ + extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock); + extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock, + struct task_struct *proxy_owner); + extern void rt_mutex_proxy_unlock(struct rt_mutex *lock); +-extern void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter); ++extern void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter, bool savetate); + extern int __rt_mutex_start_proxy_lock(struct rt_mutex *lock, + struct rt_mutex_waiter *waiter, + struct task_struct *task); +@@ -152,9 +152,27 @@ extern int __rt_mutex_futex_trylock(struct rt_mutex *l); + + extern void rt_mutex_futex_unlock(struct rt_mutex *lock); + extern bool __rt_mutex_futex_unlock(struct rt_mutex *lock, +- struct wake_q_head *wqh); +- +-extern void rt_mutex_postunlock(struct wake_q_head *wake_q); ++ struct wake_q_head *wqh, ++ struct wake_q_head *wq_sleeper); ++ ++extern void rt_mutex_postunlock(struct wake_q_head *wake_q, ++ struct wake_q_head *wake_sleeper_q); ++ ++/* RW semaphore special interface */ ++struct ww_acquire_ctx; ++ ++extern int __rt_mutex_lock_state(struct rt_mutex *lock, int state); ++extern int __rt_mutex_trylock(struct rt_mutex *lock); ++extern void __rt_mutex_unlock(struct rt_mutex *lock); ++int __sched rt_mutex_slowlock_locked(struct rt_mutex *lock, int state, ++ struct hrtimer_sleeper *timeout, ++ enum rtmutex_chainwalk chwalk, ++ struct ww_acquire_ctx *ww_ctx, ++ struct rt_mutex_waiter *waiter); ++void __sched rt_spin_lock_slowlock_locked(struct rt_mutex *lock, ++ struct rt_mutex_waiter *waiter, ++ unsigned long flags); ++void __sched rt_spin_lock_slowunlock(struct rt_mutex *lock); + + #ifdef CONFIG_DEBUG_RT_MUTEXES + # include "rtmutex-debug.h" +diff --git a/kernel/locking/rwlock-rt.c b/kernel/locking/rwlock-rt.c +new file mode 100644 +index 000000000..3d2d1f14b +--- /dev/null ++++ b/kernel/locking/rwlock-rt.c +@@ -0,0 +1,334 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++#include ++#include ++ ++#include "rtmutex_common.h" ++#include ++ ++/* ++ * RT-specific reader/writer locks ++ * ++ * write_lock() ++ * 1) Lock lock->rtmutex ++ * 2) Remove the reader BIAS to force readers into the slow path ++ * 3) Wait until all readers have left the critical region ++ * 4) Mark it write locked ++ * ++ * write_unlock() ++ * 1) Remove the write locked marker ++ * 2) Set the reader BIAS so readers can use the fast path again ++ * 3) Unlock lock->rtmutex to release blocked readers ++ * ++ * read_lock() ++ * 1) Try fast path acquisition (reader BIAS is set) ++ * 2) Take lock->rtmutex.wait_lock which protects the writelocked flag ++ * 3) If !writelocked, acquire it for read ++ * 4) If writelocked, block on lock->rtmutex ++ * 5) unlock lock->rtmutex, goto 1) ++ * ++ * read_unlock() ++ * 1) Try fast path release (reader count != 1) ++ * 2) Wake the writer waiting in write_lock()#3 ++ * ++ * read_lock()#3 has the consequence, that rw locks on RT are not writer ++ * fair, but writers, which should be avoided in RT tasks (think tasklist ++ * lock), are subject to the rtmutex priority/DL inheritance mechanism. ++ * ++ * It's possible to make the rw locks writer fair by keeping a list of ++ * active readers. A blocked writer would force all newly incoming readers ++ * to block on the rtmutex, but the rtmutex would have to be proxy locked ++ * for one reader after the other. We can't use multi-reader inheritance ++ * because there is no way to support that with ++ * SCHED_DEADLINE. Implementing the one by one reader boosting/handover ++ * mechanism is a major surgery for a very dubious value. ++ * ++ * The risk of writer starvation is there, but the pathological use cases ++ * which trigger it are not necessarily the typical RT workloads. ++ */ ++ ++void __rwlock_biased_rt_init(struct rt_rw_lock *lock, const char *name, ++ struct lock_class_key *key) ++{ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ /* ++ * Make sure we are not reinitializing a held semaphore: ++ */ ++ debug_check_no_locks_freed((void *)lock, sizeof(*lock)); ++ lockdep_init_map(&lock->dep_map, name, key, 0); ++#endif ++ atomic_set(&lock->readers, READER_BIAS); ++ rt_mutex_init(&lock->rtmutex); ++ lock->rtmutex.save_state = 1; ++} ++ ++static int __read_rt_trylock(struct rt_rw_lock *lock) ++{ ++ int r, old; ++ ++ /* ++ * Increment reader count, if lock->readers < 0, i.e. READER_BIAS is ++ * set. ++ */ ++ for (r = atomic_read(&lock->readers); r < 0;) { ++ old = atomic_cmpxchg(&lock->readers, r, r + 1); ++ if (likely(old == r)) ++ return 1; ++ r = old; ++ } ++ return 0; ++} ++ ++static void __read_rt_lock(struct rt_rw_lock *lock) ++{ ++ struct rt_mutex *m = &lock->rtmutex; ++ struct rt_mutex_waiter waiter; ++ unsigned long flags; ++ ++ if (__read_rt_trylock(lock)) ++ return; ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ /* ++ * Allow readers as long as the writer has not completely ++ * acquired the semaphore for write. ++ */ ++ if (atomic_read(&lock->readers) != WRITER_BIAS) { ++ atomic_inc(&lock->readers); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ return; ++ } ++ ++ /* ++ * Call into the slow lock path with the rtmutex->wait_lock ++ * held, so this can't result in the following race: ++ * ++ * Reader1 Reader2 Writer ++ * read_lock() ++ * write_lock() ++ * rtmutex_lock(m) ++ * swait() ++ * read_lock() ++ * unlock(m->wait_lock) ++ * read_unlock() ++ * swake() ++ * lock(m->wait_lock) ++ * lock->writelocked=true ++ * unlock(m->wait_lock) ++ * ++ * write_unlock() ++ * lock->writelocked=false ++ * rtmutex_unlock(m) ++ * read_lock() ++ * write_lock() ++ * rtmutex_lock(m) ++ * swait() ++ * rtmutex_lock(m) ++ * ++ * That would put Reader1 behind the writer waiting on ++ * Reader2 to call read_unlock() which might be unbound. ++ */ ++ rt_mutex_init_waiter(&waiter, true); ++ rt_spin_lock_slowlock_locked(m, &waiter, flags); ++ /* ++ * The slowlock() above is guaranteed to return with the rtmutex is ++ * now held, so there can't be a writer active. Increment the reader ++ * count and immediately drop the rtmutex again. ++ */ ++ atomic_inc(&lock->readers); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ rt_spin_lock_slowunlock(m); ++ ++ debug_rt_mutex_free_waiter(&waiter); ++} ++ ++static void __read_rt_unlock(struct rt_rw_lock *lock) ++{ ++ struct rt_mutex *m = &lock->rtmutex; ++ struct task_struct *tsk; ++ ++ /* ++ * sem->readers can only hit 0 when a writer is waiting for the ++ * active readers to leave the critical region. ++ */ ++ if (!atomic_dec_and_test(&lock->readers)) ++ return; ++ ++ raw_spin_lock_irq(&m->wait_lock); ++ /* ++ * Wake the writer, i.e. the rtmutex owner. It might release the ++ * rtmutex concurrently in the fast path, but to clean up the rw ++ * lock it needs to acquire m->wait_lock. The worst case which can ++ * happen is a spurious wakeup. ++ */ ++ tsk = rt_mutex_owner(m); ++ if (tsk) ++ wake_up_process(tsk); ++ ++ raw_spin_unlock_irq(&m->wait_lock); ++} ++ ++static void __write_unlock_common(struct rt_rw_lock *lock, int bias, ++ unsigned long flags) ++{ ++ struct rt_mutex *m = &lock->rtmutex; ++ ++ atomic_add(READER_BIAS - bias, &lock->readers); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ rt_spin_lock_slowunlock(m); ++} ++ ++static void __write_rt_lock(struct rt_rw_lock *lock) ++{ ++ struct rt_mutex *m = &lock->rtmutex; ++ struct task_struct *self = current; ++ unsigned long flags; ++ ++ /* Take the rtmutex as a first step */ ++ __rt_spin_lock(m); ++ ++ /* Force readers into slow path */ ++ atomic_sub(READER_BIAS, &lock->readers); ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ ++ raw_spin_lock(&self->pi_lock); ++ self->saved_state = self->state; ++ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); ++ raw_spin_unlock(&self->pi_lock); ++ ++ for (;;) { ++ /* Have all readers left the critical region? */ ++ if (!atomic_read(&lock->readers)) { ++ atomic_set(&lock->readers, WRITER_BIAS); ++ raw_spin_lock(&self->pi_lock); ++ __set_current_state_no_track(self->saved_state); ++ self->saved_state = TASK_RUNNING; ++ raw_spin_unlock(&self->pi_lock); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ return; ++ } ++ ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ ++ if (atomic_read(&lock->readers) != 0) ++ preempt_schedule_lock(); ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ ++ raw_spin_lock(&self->pi_lock); ++ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); ++ raw_spin_unlock(&self->pi_lock); ++ } ++} ++ ++static int __write_rt_trylock(struct rt_rw_lock *lock) ++{ ++ struct rt_mutex *m = &lock->rtmutex; ++ unsigned long flags; ++ ++ if (!__rt_mutex_trylock(m)) ++ return 0; ++ ++ atomic_sub(READER_BIAS, &lock->readers); ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ if (!atomic_read(&lock->readers)) { ++ atomic_set(&lock->readers, WRITER_BIAS); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ return 1; ++ } ++ __write_unlock_common(lock, 0, flags); ++ return 0; ++} ++ ++static void __write_rt_unlock(struct rt_rw_lock *lock) ++{ ++ struct rt_mutex *m = &lock->rtmutex; ++ unsigned long flags; ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ __write_unlock_common(lock, WRITER_BIAS, flags); ++} ++ ++int __lockfunc rt_read_can_lock(rwlock_t *rwlock) ++{ ++ return atomic_read(&rwlock->readers) < 0; ++} ++ ++int __lockfunc rt_write_can_lock(rwlock_t *rwlock) ++{ ++ return atomic_read(&rwlock->readers) == READER_BIAS; ++} ++ ++/* ++ * The common functions which get wrapped into the rwlock API. ++ */ ++int __lockfunc rt_read_trylock(rwlock_t *rwlock) ++{ ++ int ret; ++ ++ ret = __read_rt_trylock(rwlock); ++ if (ret) { ++ rwlock_acquire_read(&rwlock->dep_map, 0, 1, _RET_IP_); ++ rcu_read_lock(); ++ migrate_disable(); ++ } ++ return ret; ++} ++EXPORT_SYMBOL(rt_read_trylock); ++ ++int __lockfunc rt_write_trylock(rwlock_t *rwlock) ++{ ++ int ret; ++ ++ ret = __write_rt_trylock(rwlock); ++ if (ret) { ++ rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_); ++ rcu_read_lock(); ++ migrate_disable(); ++ } ++ return ret; ++} ++EXPORT_SYMBOL(rt_write_trylock); ++ ++void __lockfunc rt_read_lock(rwlock_t *rwlock) ++{ ++ rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_); ++ __read_rt_lock(rwlock); ++ rcu_read_lock(); ++ migrate_disable(); ++} ++EXPORT_SYMBOL(rt_read_lock); ++ ++void __lockfunc rt_write_lock(rwlock_t *rwlock) ++{ ++ rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_); ++ __write_rt_lock(rwlock); ++ rcu_read_lock(); ++ migrate_disable(); ++} ++EXPORT_SYMBOL(rt_write_lock); ++ ++void __lockfunc rt_read_unlock(rwlock_t *rwlock) ++{ ++ rwlock_release(&rwlock->dep_map, _RET_IP_); ++ migrate_enable(); ++ rcu_read_unlock(); ++ __read_rt_unlock(rwlock); ++} ++EXPORT_SYMBOL(rt_read_unlock); ++ ++void __lockfunc rt_write_unlock(rwlock_t *rwlock) ++{ ++ rwlock_release(&rwlock->dep_map, _RET_IP_); ++ migrate_enable(); ++ rcu_read_unlock(); ++ __write_rt_unlock(rwlock); ++} ++EXPORT_SYMBOL(rt_write_unlock); ++ ++void __rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key) ++{ ++ __rwlock_biased_rt_init(rwlock, name, key); ++} ++EXPORT_SYMBOL(__rt_rwlock_init); +diff --git a/kernel/locking/rwsem-rt.c b/kernel/locking/rwsem-rt.c +new file mode 100644 +index 000000000..b61edc4dc +--- /dev/null ++++ b/kernel/locking/rwsem-rt.c +@@ -0,0 +1,317 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++#include ++#include ++#include ++#include ++#include ++ ++#include "rtmutex_common.h" ++ ++/* ++ * RT-specific reader/writer semaphores ++ * ++ * down_write() ++ * 1) Lock sem->rtmutex ++ * 2) Remove the reader BIAS to force readers into the slow path ++ * 3) Wait until all readers have left the critical region ++ * 4) Mark it write locked ++ * ++ * up_write() ++ * 1) Remove the write locked marker ++ * 2) Set the reader BIAS so readers can use the fast path again ++ * 3) Unlock sem->rtmutex to release blocked readers ++ * ++ * down_read() ++ * 1) Try fast path acquisition (reader BIAS is set) ++ * 2) Take sem->rtmutex.wait_lock which protects the writelocked flag ++ * 3) If !writelocked, acquire it for read ++ * 4) If writelocked, block on sem->rtmutex ++ * 5) unlock sem->rtmutex, goto 1) ++ * ++ * up_read() ++ * 1) Try fast path release (reader count != 1) ++ * 2) Wake the writer waiting in down_write()#3 ++ * ++ * down_read()#3 has the consequence, that rw semaphores on RT are not writer ++ * fair, but writers, which should be avoided in RT tasks (think mmap_sem), ++ * are subject to the rtmutex priority/DL inheritance mechanism. ++ * ++ * It's possible to make the rw semaphores writer fair by keeping a list of ++ * active readers. A blocked writer would force all newly incoming readers to ++ * block on the rtmutex, but the rtmutex would have to be proxy locked for one ++ * reader after the other. We can't use multi-reader inheritance because there ++ * is no way to support that with SCHED_DEADLINE. Implementing the one by one ++ * reader boosting/handover mechanism is a major surgery for a very dubious ++ * value. ++ * ++ * The risk of writer starvation is there, but the pathological use cases ++ * which trigger it are not necessarily the typical RT workloads. ++ */ ++ ++void __rwsem_init(struct rw_semaphore *sem, const char *name, ++ struct lock_class_key *key) ++{ ++#ifdef CONFIG_DEBUG_LOCK_ALLOC ++ /* ++ * Make sure we are not reinitializing a held semaphore: ++ */ ++ debug_check_no_locks_freed((void *)sem, sizeof(*sem)); ++ lockdep_init_map(&sem->dep_map, name, key, 0); ++#endif ++ atomic_set(&sem->readers, READER_BIAS); ++} ++EXPORT_SYMBOL(__rwsem_init); ++ ++int __down_read_trylock(struct rw_semaphore *sem) ++{ ++ int r, old; ++ ++ /* ++ * Increment reader count, if sem->readers < 0, i.e. READER_BIAS is ++ * set. ++ */ ++ for (r = atomic_read(&sem->readers); r < 0;) { ++ old = atomic_cmpxchg(&sem->readers, r, r + 1); ++ if (likely(old == r)) ++ return 1; ++ r = old; ++ } ++ return 0; ++} ++ ++static int __sched __down_read_common(struct rw_semaphore *sem, int state) ++{ ++ struct rt_mutex *m = &sem->rtmutex; ++ struct rt_mutex_waiter waiter; ++ int ret; ++ ++ if (__down_read_trylock(sem)) ++ return 0; ++ ++ /* ++ * Flush blk before ->pi_blocked_on is set. At schedule() time it is too ++ * late if one of the callbacks needs to acquire a sleeping lock. ++ */ ++ if (blk_needs_flush_plug(current)) ++ blk_schedule_flush_plug(current); ++ ++ might_sleep(); ++ raw_spin_lock_irq(&m->wait_lock); ++ /* ++ * Allow readers as long as the writer has not completely ++ * acquired the semaphore for write. ++ */ ++ if (atomic_read(&sem->readers) != WRITER_BIAS) { ++ atomic_inc(&sem->readers); ++ raw_spin_unlock_irq(&m->wait_lock); ++ return 0; ++ } ++ ++ /* ++ * Call into the slow lock path with the rtmutex->wait_lock ++ * held, so this can't result in the following race: ++ * ++ * Reader1 Reader2 Writer ++ * down_read() ++ * down_write() ++ * rtmutex_lock(m) ++ * swait() ++ * down_read() ++ * unlock(m->wait_lock) ++ * up_read() ++ * swake() ++ * lock(m->wait_lock) ++ * sem->writelocked=true ++ * unlock(m->wait_lock) ++ * ++ * up_write() ++ * sem->writelocked=false ++ * rtmutex_unlock(m) ++ * down_read() ++ * down_write() ++ * rtmutex_lock(m) ++ * swait() ++ * rtmutex_lock(m) ++ * ++ * That would put Reader1 behind the writer waiting on ++ * Reader2 to call up_read() which might be unbound. ++ */ ++ rt_mutex_init_waiter(&waiter, false); ++ ret = rt_mutex_slowlock_locked(m, state, NULL, RT_MUTEX_MIN_CHAINWALK, ++ NULL, &waiter); ++ /* ++ * The slowlock() above is guaranteed to return with the rtmutex (for ++ * ret = 0) is now held, so there can't be a writer active. Increment ++ * the reader count and immediately drop the rtmutex again. ++ * For ret != 0 we don't hold the rtmutex and need unlock the wait_lock. ++ * We don't own the lock then. ++ */ ++ if (!ret) ++ atomic_inc(&sem->readers); ++ raw_spin_unlock_irq(&m->wait_lock); ++ if (!ret) ++ __rt_mutex_unlock(m); ++ ++ debug_rt_mutex_free_waiter(&waiter); ++ return ret; ++} ++ ++void __down_read(struct rw_semaphore *sem) ++{ ++ int ret; ++ ++ ret = __down_read_common(sem, TASK_UNINTERRUPTIBLE); ++ WARN_ON_ONCE(ret); ++} ++ ++int __down_read_interruptible(struct rw_semaphore *sem) ++{ ++ int ret; ++ ++ ret = __down_read_common(sem, TASK_INTERRUPTIBLE); ++ if (likely(!ret)) ++ return ret; ++ WARN_ONCE(ret != -EINTR, "Unexpected state: %d\n", ret); ++ return -EINTR; ++} ++ ++int __down_read_killable(struct rw_semaphore *sem) ++{ ++ int ret; ++ ++ ret = __down_read_common(sem, TASK_KILLABLE); ++ if (likely(!ret)) ++ return ret; ++ WARN_ONCE(ret != -EINTR, "Unexpected state: %d\n", ret); ++ return -EINTR; ++} ++ ++void __up_read(struct rw_semaphore *sem) ++{ ++ struct rt_mutex *m = &sem->rtmutex; ++ struct task_struct *tsk; ++ ++ /* ++ * sem->readers can only hit 0 when a writer is waiting for the ++ * active readers to leave the critical region. ++ */ ++ if (!atomic_dec_and_test(&sem->readers)) ++ return; ++ ++ raw_spin_lock_irq(&m->wait_lock); ++ /* ++ * Wake the writer, i.e. the rtmutex owner. It might release the ++ * rtmutex concurrently in the fast path (due to a signal), but to ++ * clean up the rwsem it needs to acquire m->wait_lock. The worst ++ * case which can happen is a spurious wakeup. ++ */ ++ tsk = rt_mutex_owner(m); ++ if (tsk) ++ wake_up_process(tsk); ++ ++ raw_spin_unlock_irq(&m->wait_lock); ++} ++ ++static void __up_write_unlock(struct rw_semaphore *sem, int bias, ++ unsigned long flags) ++{ ++ struct rt_mutex *m = &sem->rtmutex; ++ ++ atomic_add(READER_BIAS - bias, &sem->readers); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ __rt_mutex_unlock(m); ++} ++ ++static int __sched __down_write_common(struct rw_semaphore *sem, int state) ++{ ++ struct rt_mutex *m = &sem->rtmutex; ++ unsigned long flags; ++ ++ /* ++ * Flush blk before ->pi_blocked_on is set. At schedule() time it is too ++ * late if one of the callbacks needs to acquire a sleeping lock. ++ */ ++ if (blk_needs_flush_plug(current)) ++ blk_schedule_flush_plug(current); ++ ++ /* Take the rtmutex as a first step */ ++ if (__rt_mutex_lock_state(m, state)) ++ return -EINTR; ++ ++ /* Force readers into slow path */ ++ atomic_sub(READER_BIAS, &sem->readers); ++ might_sleep(); ++ ++ set_current_state(state); ++ for (;;) { ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ /* Have all readers left the critical region? */ ++ if (!atomic_read(&sem->readers)) { ++ atomic_set(&sem->readers, WRITER_BIAS); ++ __set_current_state(TASK_RUNNING); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ return 0; ++ } ++ ++ if (signal_pending_state(state, current)) { ++ __set_current_state(TASK_RUNNING); ++ __up_write_unlock(sem, 0, flags); ++ return -EINTR; ++ } ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ ++ if (atomic_read(&sem->readers) != 0) { ++ schedule(); ++ set_current_state(state); ++ } ++ } ++} ++ ++void __sched __down_write(struct rw_semaphore *sem) ++{ ++ __down_write_common(sem, TASK_UNINTERRUPTIBLE); ++} ++ ++int __sched __down_write_killable(struct rw_semaphore *sem) ++{ ++ return __down_write_common(sem, TASK_KILLABLE); ++} ++ ++int __down_write_trylock(struct rw_semaphore *sem) ++{ ++ struct rt_mutex *m = &sem->rtmutex; ++ unsigned long flags; ++ ++ if (!__rt_mutex_trylock(m)) ++ return 0; ++ ++ atomic_sub(READER_BIAS, &sem->readers); ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ if (!atomic_read(&sem->readers)) { ++ atomic_set(&sem->readers, WRITER_BIAS); ++ raw_spin_unlock_irqrestore(&m->wait_lock, flags); ++ return 1; ++ } ++ __up_write_unlock(sem, 0, flags); ++ return 0; ++} ++ ++void __up_write(struct rw_semaphore *sem) ++{ ++ struct rt_mutex *m = &sem->rtmutex; ++ unsigned long flags; ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ __up_write_unlock(sem, WRITER_BIAS, flags); ++} ++ ++void __downgrade_write(struct rw_semaphore *sem) ++{ ++ struct rt_mutex *m = &sem->rtmutex; ++ unsigned long flags; ++ ++ raw_spin_lock_irqsave(&m->wait_lock, flags); ++ /* Release it and account current as reader */ ++ __up_write_unlock(sem, WRITER_BIAS - 1, flags); ++} +diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c +index a163542d1..3821c7204 100644 +--- a/kernel/locking/rwsem.c ++++ b/kernel/locking/rwsem.c +@@ -28,6 +28,7 @@ + #include + #include + ++#ifndef CONFIG_PREEMPT_RT + #include "lock_events.h" + + /* +@@ -1494,6 +1495,7 @@ static inline void __downgrade_write(struct rw_semaphore *sem) + if (tmp & RWSEM_FLAG_WAITERS) + rwsem_downgrade_wake(sem); + } ++#endif + + /* + * lock for reading +@@ -1657,7 +1659,9 @@ void down_read_non_owner(struct rw_semaphore *sem) + { + might_sleep(); + __down_read(sem); ++#ifndef CONFIG_PREEMPT_RT + __rwsem_set_reader_owned(sem, NULL); ++#endif + } + EXPORT_SYMBOL(down_read_non_owner); + +@@ -1686,7 +1690,9 @@ EXPORT_SYMBOL(down_write_killable_nested); + + void up_read_non_owner(struct rw_semaphore *sem) + { ++#ifndef CONFIG_PREEMPT_RT + DEBUG_RWSEMS_WARN_ON(!is_rwsem_reader_owned(sem), sem); ++#endif + __up_read(sem); + } + EXPORT_SYMBOL(up_read_non_owner); +diff --git a/kernel/locking/spinlock.c b/kernel/locking/spinlock.c +index 0ff08380f..45445a2f1 100644 +--- a/kernel/locking/spinlock.c ++++ b/kernel/locking/spinlock.c +@@ -124,8 +124,11 @@ void __lockfunc __raw_##op##_lock_bh(locktype##_t *lock) \ + * __[spin|read|write]_lock_bh() + */ + BUILD_LOCK_OPS(spin, raw_spinlock); ++ ++#ifndef CONFIG_PREEMPT_RT + BUILD_LOCK_OPS(read, rwlock); + BUILD_LOCK_OPS(write, rwlock); ++#endif + + #endif + +@@ -209,6 +212,8 @@ void __lockfunc _raw_spin_unlock_bh(raw_spinlock_t *lock) + EXPORT_SYMBOL(_raw_spin_unlock_bh); + #endif + ++#ifndef CONFIG_PREEMPT_RT ++ + #ifndef CONFIG_INLINE_READ_TRYLOCK + int __lockfunc _raw_read_trylock(rwlock_t *lock) + { +@@ -353,6 +358,8 @@ void __lockfunc _raw_write_unlock_bh(rwlock_t *lock) + EXPORT_SYMBOL(_raw_write_unlock_bh); + #endif + ++#endif /* !PREEMPT_RT */ ++ + #ifdef CONFIG_DEBUG_LOCK_ALLOC + + void __lockfunc _raw_spin_lock_nested(raw_spinlock_t *lock, int subclass) +diff --git a/kernel/locking/spinlock_debug.c b/kernel/locking/spinlock_debug.c +index b9d93087e..72e306e0e 100644 +--- a/kernel/locking/spinlock_debug.c ++++ b/kernel/locking/spinlock_debug.c +@@ -31,6 +31,7 @@ void __raw_spin_lock_init(raw_spinlock_t *lock, const char *name, + + EXPORT_SYMBOL(__raw_spin_lock_init); + ++#ifndef CONFIG_PREEMPT_RT + void __rwlock_init(rwlock_t *lock, const char *name, + struct lock_class_key *key) + { +@@ -48,6 +49,7 @@ void __rwlock_init(rwlock_t *lock, const char *name, + } + + EXPORT_SYMBOL(__rwlock_init); ++#endif + + static void spin_dump(raw_spinlock_t *lock, const char *msg) + { +@@ -139,6 +141,7 @@ void do_raw_spin_unlock(raw_spinlock_t *lock) + arch_spin_unlock(&lock->raw_lock); + } + ++#ifndef CONFIG_PREEMPT_RT + static void rwlock_bug(rwlock_t *lock, const char *msg) + { + if (!debug_locks_off()) +@@ -228,3 +231,5 @@ void do_raw_write_unlock(rwlock_t *lock) + debug_write_unlock(lock); + arch_write_unlock(&lock->raw_lock); + } ++ ++#endif +diff --git a/kernel/notifier.c b/kernel/notifier.c +index 1b019cbca..c20782f07 100644 +--- a/kernel/notifier.c ++++ b/kernel/notifier.c +@@ -142,9 +142,9 @@ int atomic_notifier_chain_register(struct atomic_notifier_head *nh, + unsigned long flags; + int ret; + +- spin_lock_irqsave(&nh->lock, flags); ++ raw_spin_lock_irqsave(&nh->lock, flags); + ret = notifier_chain_register(&nh->head, n); +- spin_unlock_irqrestore(&nh->lock, flags); ++ raw_spin_unlock_irqrestore(&nh->lock, flags); + return ret; + } + EXPORT_SYMBOL_GPL(atomic_notifier_chain_register); +@@ -164,9 +164,9 @@ int atomic_notifier_chain_unregister(struct atomic_notifier_head *nh, + unsigned long flags; + int ret; + +- spin_lock_irqsave(&nh->lock, flags); ++ raw_spin_lock_irqsave(&nh->lock, flags); + ret = notifier_chain_unregister(&nh->head, n); +- spin_unlock_irqrestore(&nh->lock, flags); ++ raw_spin_unlock_irqrestore(&nh->lock, flags); + synchronize_rcu(); + return ret; + } +@@ -182,9 +182,9 @@ int atomic_notifier_call_chain_robust(struct atomic_notifier_head *nh, + * Musn't use RCU; because then the notifier list can + * change between the up and down traversal. + */ +- spin_lock_irqsave(&nh->lock, flags); ++ raw_spin_lock_irqsave(&nh->lock, flags); + ret = notifier_call_chain_robust(&nh->head, val_up, val_down, v); +- spin_unlock_irqrestore(&nh->lock, flags); ++ raw_spin_unlock_irqrestore(&nh->lock, flags); + + return ret; + } +diff --git a/kernel/panic.c b/kernel/panic.c +index d991c3b1b..fa3025e0c 100644 +--- a/kernel/panic.c ++++ b/kernel/panic.c +@@ -177,12 +177,28 @@ static void panic_print_sys_info(void) + void panic(const char *fmt, ...) + { + static char buf[1024]; ++ va_list args2; + va_list args; + long i, i_next = 0, len; + int state = 0; + int old_cpu, this_cpu; + bool _crash_kexec_post_notifiers = crash_kexec_post_notifiers; + ++ console_verbose(); ++ pr_emerg("Kernel panic - not syncing:\n"); ++ va_start(args2, fmt); ++ va_copy(args, args2); ++ vprintk(fmt, args2); ++ va_end(args2); ++#ifdef CONFIG_DEBUG_BUGVERBOSE ++ /* ++ * Avoid nested stack-dumping if a panic occurs during oops processing ++ */ ++ if (!test_taint(TAINT_DIE) && oops_in_progress <= 1) ++ dump_stack(); ++#endif ++ pr_flush(1000, true); ++ + /* + * Disable local interrupts. This will prevent panic_smp_self_stop + * from deadlocking the first cpu that invokes the panic, since +@@ -213,24 +229,13 @@ void panic(const char *fmt, ...) + if (old_cpu != PANIC_CPU_INVALID && old_cpu != this_cpu) + panic_smp_self_stop(); + +- console_verbose(); + bust_spinlocks(1); +- va_start(args, fmt); + len = vscnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + + if (len && buf[len - 1] == '\n') + buf[len - 1] = '\0'; + +- pr_emerg("Kernel panic - not syncing: %s\n", buf); +-#ifdef CONFIG_DEBUG_BUGVERBOSE +- /* +- * Avoid nested stack-dumping if a panic occurs during oops processing +- */ +- if (!test_taint(TAINT_DIE) && oops_in_progress <= 1) +- dump_stack(); +-#endif +- + /* + * If kgdb is enabled, give it a chance to run before we stop all + * the other CPUs or else we won't be able to debug processes left +@@ -247,7 +252,6 @@ void panic(const char *fmt, ...) + * Bypass the panic_cpu check and call __crash_kexec directly. + */ + if (!_crash_kexec_post_notifiers) { +- printk_safe_flush_on_panic(); + __crash_kexec(NULL); + + /* +@@ -298,8 +302,6 @@ void panic(const char *fmt, ...) + */ + atomic_notifier_call_chain(&panic_notifier_list, 0, buf); + +- /* Call flush even twice. It tries harder with a single online CPU */ +- printk_safe_flush_on_panic(); + kmsg_dump(KMSG_DUMP_PANIC); + + /* +@@ -569,9 +571,11 @@ static u64 oops_id; + + static int init_oops_id(void) + { ++#ifndef CONFIG_PREEMPT_RT + if (!oops_id) + get_random_bytes(&oops_id, sizeof(oops_id)); + else ++#endif + oops_id++; + + return 0; +@@ -582,6 +586,7 @@ static void print_oops_end_marker(void) + { + init_oops_id(); + pr_warn("---[ end trace %016llx ]---\n", (unsigned long long)oops_id); ++ pr_flush(1000, true); + } + + /* +diff --git a/kernel/printk/Makefile b/kernel/printk/Makefile +index eee3dc9b6..59cb24e25 100644 +--- a/kernel/printk/Makefile ++++ b/kernel/printk/Makefile +@@ -1,5 +1,4 @@ + # SPDX-License-Identifier: GPL-2.0-only + obj-y = printk.o +-obj-$(CONFIG_PRINTK) += printk_safe.o + obj-$(CONFIG_A11Y_BRAILLE_CONSOLE) += braille.o + obj-$(CONFIG_PRINTK) += printk_ringbuffer.o +diff --git a/kernel/printk/internal.h b/kernel/printk/internal.h +index b1c155328..059c3d876 100644 +--- a/kernel/printk/internal.h ++++ b/kernel/printk/internal.h +@@ -12,8 +12,6 @@ + + #define PRINTK_NMI_CONTEXT_OFFSET 0x010000000 + +-extern raw_spinlock_t logbuf_lock; +- + __printf(4, 0) + int vprintk_store(int facility, int level, + const struct dev_printk_info *dev_info, +@@ -23,7 +21,6 @@ __printf(1, 0) int vprintk_default(const char *fmt, va_list args); + __printf(1, 0) int vprintk_deferred(const char *fmt, va_list args); + __printf(1, 0) int vprintk_func(const char *fmt, va_list args); + +-void printk_safe_init(void); + bool printk_percpu_data_ready(void); + + void defer_console_output(void); +@@ -32,6 +29,5 @@ void defer_console_output(void); + + __printf(1, 0) int vprintk_func(const char *fmt, va_list args) { return 0; } + +-static inline void printk_safe_init(void) { } + static inline bool printk_percpu_data_ready(void) { return false; } + #endif /* CONFIG_PRINTK */ +diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c +index 43f8f2573..eeeb590e1 100644 +--- a/kernel/printk/printk.c ++++ b/kernel/printk/printk.c +@@ -44,6 +44,9 @@ + #include + #include + #include ++#include ++#include ++#include + #include + #include + #include +@@ -58,7 +61,6 @@ + #include "printk_ringbuffer.h" + #include "console_cmdline.h" + #include "braille.h" +-#include "internal.h" + + int console_printk[4] = { + CONSOLE_LOGLEVEL_DEFAULT, /* console_loglevel */ +@@ -225,19 +227,7 @@ static int nr_ext_console_drivers; + + static int __down_trylock_console_sem(unsigned long ip) + { +- int lock_failed; +- unsigned long flags; +- +- /* +- * Here and in __up_console_sem() we need to be in safe mode, +- * because spindump/WARN/etc from under console ->lock will +- * deadlock in printk()->down_trylock_console_sem() otherwise. +- */ +- printk_safe_enter_irqsave(flags); +- lock_failed = down_trylock(&console_sem); +- printk_safe_exit_irqrestore(flags); +- +- if (lock_failed) ++ if (down_trylock(&console_sem)) + return 1; + mutex_acquire(&console_lock_dep_map, 0, 1, ip); + return 0; +@@ -246,13 +236,9 @@ static int __down_trylock_console_sem(unsigned long ip) + + static void __up_console_sem(unsigned long ip) + { +- unsigned long flags; +- + mutex_release(&console_lock_dep_map, ip); + +- printk_safe_enter_irqsave(flags); + up(&console_sem); +- printk_safe_exit_irqrestore(flags); + } + #define up_console_sem() __up_console_sem(_RET_IP_) + +@@ -266,11 +252,6 @@ static void __up_console_sem(unsigned long ip) + */ + static int console_locked, console_suspended; + +-/* +- * If exclusive_console is non-NULL then only this console is to be printed to. +- */ +-static struct console *exclusive_console; +- + /* + * Array of consoles built from command line options (console=) + */ +@@ -355,61 +336,43 @@ enum log_flags { + LOG_CONT = 8, /* text is a fragment of a continuation line */ + }; + +-/* +- * The logbuf_lock protects kmsg buffer, indices, counters. This can be taken +- * within the scheduler's rq lock. It must be released before calling +- * console_unlock() or anything else that might wake up a process. +- */ +-DEFINE_RAW_SPINLOCK(logbuf_lock); ++#ifdef CONFIG_PRINTK ++/* syslog_lock protects syslog_* variables and write access to clear_seq. */ ++static DEFINE_SPINLOCK(syslog_lock); + +-/* +- * Helper macros to lock/unlock logbuf_lock and switch between +- * printk-safe/unsafe modes. +- */ +-#define logbuf_lock_irq() \ +- do { \ +- printk_safe_enter_irq(); \ +- raw_spin_lock(&logbuf_lock); \ +- } while (0) +- +-#define logbuf_unlock_irq() \ +- do { \ +- raw_spin_unlock(&logbuf_lock); \ +- printk_safe_exit_irq(); \ +- } while (0) +- +-#define logbuf_lock_irqsave(flags) \ +- do { \ +- printk_safe_enter_irqsave(flags); \ +- raw_spin_lock(&logbuf_lock); \ +- } while (0) +- +-#define logbuf_unlock_irqrestore(flags) \ +- do { \ +- raw_spin_unlock(&logbuf_lock); \ +- printk_safe_exit_irqrestore(flags); \ +- } while (0) ++/* Set to enable sync mode. Once set, it is never cleared. */ ++static bool sync_mode; + +-#ifdef CONFIG_PRINTK + DECLARE_WAIT_QUEUE_HEAD(log_wait); ++/* All 3 protected by @syslog_lock. */ + /* the next printk record to read by syslog(READ) or /proc/kmsg */ + static u64 syslog_seq; + static size_t syslog_partial; + static bool syslog_time; + +-/* the next printk record to write to the console */ +-static u64 console_seq; +-static u64 exclusive_console_stop_seq; +-static unsigned long console_dropped; ++struct latched_seq { ++ seqcount_latch_t latch; ++ u64 val[2]; ++}; + +-/* the next printk record to read after the last 'clear' command */ +-static u64 clear_seq; ++/* ++ * The next printk record to read after the last 'clear' command. There are ++ * two copies (updated with seqcount_latch) so that reads can locklessly ++ * access a valid value. Writers are synchronized by @syslog_lock. ++ */ ++static struct latched_seq clear_seq = { ++ .latch = SEQCNT_LATCH_ZERO(clear_seq.latch), ++ .val[0] = 0, ++ .val[1] = 0, ++}; + + #ifdef CONFIG_PRINTK_CALLER + #define PREFIX_MAX 48 + #else + #define PREFIX_MAX 32 + #endif ++ ++/* the maximum size allowed to be reserved for a record */ + #define LOG_LINE_MAX (1024 - PREFIX_MAX) + + #define LOG_LEVEL(v) ((v) & 0x07) +@@ -447,11 +410,36 @@ static struct printk_ringbuffer *prb = &printk_rb_static; + */ + static bool __printk_percpu_data_ready __read_mostly; + +-bool printk_percpu_data_ready(void) ++static bool printk_percpu_data_ready(void) + { + return __printk_percpu_data_ready; + } + ++/* Must be called under syslog_lock. */ ++static void latched_seq_write(struct latched_seq *ls, u64 val) ++{ ++ raw_write_seqcount_latch(&ls->latch); ++ ls->val[0] = val; ++ raw_write_seqcount_latch(&ls->latch); ++ ls->val[1] = val; ++} ++ ++/* Can be called from any context. */ ++static u64 latched_seq_read_nolock(struct latched_seq *ls) ++{ ++ unsigned int seq; ++ unsigned int idx; ++ u64 val; ++ ++ do { ++ seq = raw_read_seqcount_latch(&ls->latch); ++ idx = seq & 0x1; ++ val = ls->val[idx]; ++ } while (read_seqcount_latch_retry(&ls->latch, seq)); ++ ++ return val; ++} ++ + /* Return log buffer address */ + char *log_buf_addr_get(void) + { +@@ -493,52 +481,6 @@ static void truncate_msg(u16 *text_len, u16 *trunc_msg_len) + *trunc_msg_len = 0; + } + +-/* insert record into the buffer, discard old ones, update heads */ +-static int log_store(u32 caller_id, int facility, int level, +- enum log_flags flags, u64 ts_nsec, +- const struct dev_printk_info *dev_info, +- const char *text, u16 text_len) +-{ +- struct prb_reserved_entry e; +- struct printk_record r; +- u16 trunc_msg_len = 0; +- +- prb_rec_init_wr(&r, text_len); +- +- if (!prb_reserve(&e, prb, &r)) { +- /* truncate the message if it is too long for empty buffer */ +- truncate_msg(&text_len, &trunc_msg_len); +- prb_rec_init_wr(&r, text_len + trunc_msg_len); +- /* survive when the log buffer is too small for trunc_msg */ +- if (!prb_reserve(&e, prb, &r)) +- return 0; +- } +- +- /* fill message */ +- memcpy(&r.text_buf[0], text, text_len); +- if (trunc_msg_len) +- memcpy(&r.text_buf[text_len], trunc_msg, trunc_msg_len); +- r.info->text_len = text_len + trunc_msg_len; +- r.info->facility = facility; +- r.info->level = level & 7; +- r.info->flags = flags & 0x1f; +- if (ts_nsec > 0) +- r.info->ts_nsec = ts_nsec; +- else +- r.info->ts_nsec = local_clock(); +- r.info->caller_id = caller_id; +- if (dev_info) +- memcpy(&r.info->dev_info, dev_info, sizeof(r.info->dev_info)); +- +- /* A message without a trailing newline can be continued. */ +- if (!(flags & LOG_NEWLINE)) +- prb_commit(&e); +- else +- prb_final_commit(&e); +- +- return (text_len + trunc_msg_len); +-} +- + int dmesg_restrict = IS_ENABLED(CONFIG_SECURITY_DMESG_RESTRICT); + + static int syslog_action_restricted(int type) +@@ -667,7 +609,7 @@ static ssize_t msg_print_ext_body(char *buf, size_t size, + + /* /dev/kmsg - userspace message inject/listen interface */ + struct devkmsg_user { +- u64 seq; ++ atomic64_t seq; + struct ratelimit_state rs; + struct mutex lock; + char buf[CONSOLE_EXT_LOG_MAX]; +@@ -768,27 +710,22 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf, + if (ret) + return ret; + +- logbuf_lock_irq(); +- if (!prb_read_valid(prb, user->seq, r)) { ++ if (!prb_read_valid(prb, atomic64_read(&user->seq), r)) { + if (file->f_flags & O_NONBLOCK) { + ret = -EAGAIN; +- logbuf_unlock_irq(); + goto out; + } + +- logbuf_unlock_irq(); + ret = wait_event_interruptible(log_wait, +- prb_read_valid(prb, user->seq, r)); ++ prb_read_valid(prb, atomic64_read(&user->seq), r)); + if (ret) + goto out; +- logbuf_lock_irq(); + } + +- if (r->info->seq != user->seq) { ++ if (r->info->seq != atomic64_read(&user->seq)) { + /* our last seen message is gone, return error and reset */ +- user->seq = r->info->seq; ++ atomic64_set(&user->seq, r->info->seq); + ret = -EPIPE; +- logbuf_unlock_irq(); + goto out; + } + +@@ -797,8 +734,7 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf, + &r->text_buf[0], r->info->text_len, + &r->info->dev_info); + +- user->seq = r->info->seq + 1; +- logbuf_unlock_irq(); ++ atomic64_set(&user->seq, r->info->seq + 1); + + if (len > count) { + ret = -EINVAL; +@@ -833,11 +769,10 @@ static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence) + if (offset) + return -ESPIPE; + +- logbuf_lock_irq(); + switch (whence) { + case SEEK_SET: + /* the first record */ +- user->seq = prb_first_valid_seq(prb); ++ atomic64_set(&user->seq, prb_first_valid_seq(prb)); + break; + case SEEK_DATA: + /* +@@ -845,16 +780,15 @@ static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence) + * like issued by 'dmesg -c'. Reading /dev/kmsg itself + * changes no global state, and does not clear anything. + */ +- user->seq = clear_seq; ++ atomic64_set(&user->seq, latched_seq_read_nolock(&clear_seq)); + break; + case SEEK_END: + /* after the last record */ +- user->seq = prb_next_seq(prb); ++ atomic64_set(&user->seq, prb_next_seq(prb)); + break; + default: + ret = -EINVAL; + } +- logbuf_unlock_irq(); + return ret; + } + +@@ -869,15 +803,13 @@ static __poll_t devkmsg_poll(struct file *file, poll_table *wait) + + poll_wait(file, &log_wait, wait); + +- logbuf_lock_irq(); +- if (prb_read_valid_info(prb, user->seq, &info, NULL)) { ++ if (prb_read_valid_info(prb, atomic64_read(&user->seq), &info, NULL)) { + /* return error when data has vanished underneath us */ +- if (info.seq != user->seq) ++ if (info.seq != atomic64_read(&user->seq)) + ret = EPOLLIN|EPOLLRDNORM|EPOLLERR|EPOLLPRI; + else + ret = EPOLLIN|EPOLLRDNORM; + } +- logbuf_unlock_irq(); + + return ret; + } +@@ -910,9 +842,7 @@ static int devkmsg_open(struct inode *inode, struct file *file) + prb_rec_init_rd(&user->record, &user->info, + &user->text_buf[0], sizeof(user->text_buf)); + +- logbuf_lock_irq(); +- user->seq = prb_first_valid_seq(prb); +- logbuf_unlock_irq(); ++ atomic64_set(&user->seq, prb_first_valid_seq(prb)); + + file->private_data = user; + return 0; +@@ -1004,6 +934,9 @@ void log_buf_vmcoreinfo_setup(void) + + VMCOREINFO_SIZE(atomic_long_t); + VMCOREINFO_TYPE_OFFSET(atomic_long_t, counter); ++ ++ VMCOREINFO_STRUCT_SIZE(latched_seq); ++ VMCOREINFO_OFFSET(latched_seq, val); + } + #endif + +@@ -1075,9 +1008,6 @@ static inline void log_buf_add_cpu(void) {} + + static void __init set_percpu_data_ready(void) + { +- printk_safe_init(); +- /* Make sure we set this flag only after printk_safe() init is done */ +- barrier(); + __printk_percpu_data_ready = true; + } + +@@ -1117,7 +1047,6 @@ void __init setup_log_buf(int early) + struct printk_record r; + size_t new_descs_size; + size_t new_infos_size; +- unsigned long flags; + char *new_log_buf; + unsigned int free; + u64 seq; +@@ -1175,8 +1104,6 @@ void __init setup_log_buf(int early) + new_descs, ilog2(new_descs_count), + new_infos); + +- logbuf_lock_irqsave(flags); +- + log_buf_len = new_log_buf_len; + log_buf = new_log_buf; + new_log_buf_len = 0; +@@ -1192,8 +1119,6 @@ void __init setup_log_buf(int early) + */ + prb = &printk_rb_dynamic; + +- logbuf_unlock_irqrestore(flags); +- + if (seq != prb_next_seq(&printk_rb_static)) { + pr_err("dropped %llu messages\n", + prb_next_seq(&printk_rb_static) - seq); +@@ -1470,6 +1395,50 @@ static size_t get_record_print_text_size(struct printk_info *info, + return ((prefix_len * line_count) + info->text_len + 1); + } + ++/* ++ * Beginning with @start_seq, find the first record where it and all following ++ * records up to (but not including) @max_seq fit into @size. ++ * ++ * @max_seq is simply an upper bound and does not need to exist. If the caller ++ * does not require an upper bound, -1 can be used for @max_seq. ++ */ ++static u64 find_first_fitting_seq(u64 start_seq, u64 max_seq, size_t size, ++ bool syslog, bool time) ++{ ++ struct printk_info info; ++ unsigned int line_count; ++ size_t len = 0; ++ u64 seq; ++ ++ /* Determine the size of the records up to @max_seq. */ ++ prb_for_each_info(start_seq, prb, seq, &info, &line_count) { ++ if (info.seq >= max_seq) ++ break; ++ len += get_record_print_text_size(&info, line_count, syslog, time); ++ } ++ ++ /* ++ * Adjust the upper bound for the next loop to avoid subtracting ++ * lengths that were never added. ++ */ ++ if (seq < max_seq) ++ max_seq = seq; ++ ++ /* ++ * Move first record forward until length fits into the buffer. Ignore ++ * newest messages that were not counted in the above cycle. Messages ++ * might appear and get lost in the meantime. This is a best effort ++ * that prevents an infinite loop that could occur with a retry. ++ */ ++ prb_for_each_info(start_seq, prb, seq, &info, &line_count) { ++ if (len <= size || info.seq >= max_seq) ++ break; ++ len -= get_record_print_text_size(&info, line_count, syslog, time); ++ } ++ ++ return seq; ++} ++ + static int syslog_print(char __user *buf, int size) + { + struct printk_info info; +@@ -1477,19 +1446,19 @@ static int syslog_print(char __user *buf, int size) + char *text; + int len = 0; + +- text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL); ++ text = kmalloc(CONSOLE_LOG_MAX, GFP_KERNEL); + if (!text) + return -ENOMEM; + +- prb_rec_init_rd(&r, &info, text, LOG_LINE_MAX + PREFIX_MAX); ++ prb_rec_init_rd(&r, &info, text, CONSOLE_LOG_MAX); + + while (size > 0) { + size_t n; + size_t skip; + +- logbuf_lock_irq(); ++ spin_lock_irq(&syslog_lock); + if (!prb_read_valid(prb, syslog_seq, &r)) { +- logbuf_unlock_irq(); ++ spin_unlock_irq(&syslog_lock); + break; + } + if (r.info->seq != syslog_seq) { +@@ -1518,7 +1487,7 @@ static int syslog_print(char __user *buf, int size) + syslog_partial += n; + } else + n = 0; +- logbuf_unlock_irq(); ++ spin_unlock_irq(&syslog_lock); + + if (!n) + break; +@@ -1541,34 +1510,25 @@ static int syslog_print(char __user *buf, int size) + static int syslog_print_all(char __user *buf, int size, bool clear) + { + struct printk_info info; +- unsigned int line_count; + struct printk_record r; + char *text; + int len = 0; + u64 seq; + bool time; + +- text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL); ++ text = kmalloc(CONSOLE_LOG_MAX, GFP_KERNEL); + if (!text) + return -ENOMEM; + + time = printk_time; +- logbuf_lock_irq(); + /* + * Find first record that fits, including all following records, + * into the user-provided buffer for this dump. + */ +- prb_for_each_info(clear_seq, prb, seq, &info, &line_count) +- len += get_record_print_text_size(&info, line_count, true, time); +- +- /* move first record forward until length fits into the buffer */ +- prb_for_each_info(clear_seq, prb, seq, &info, &line_count) { +- if (len <= size) +- break; +- len -= get_record_print_text_size(&info, line_count, true, time); +- } ++ seq = find_first_fitting_seq(latched_seq_read_nolock(&clear_seq), -1, ++ size, true, time); + +- prb_rec_init_rd(&r, &info, text, LOG_LINE_MAX + PREFIX_MAX); ++ prb_rec_init_rd(&r, &info, text, CONSOLE_LOG_MAX); + + len = 0; + prb_for_each_record(seq, prb, seq, &r) { +@@ -1581,20 +1541,20 @@ static int syslog_print_all(char __user *buf, int size, bool clear) + break; + } + +- logbuf_unlock_irq(); + if (copy_to_user(buf + len, text, textlen)) + len = -EFAULT; + else + len += textlen; +- logbuf_lock_irq(); + + if (len < 0) + break; + } + +- if (clear) +- clear_seq = seq; +- logbuf_unlock_irq(); ++ if (clear) { ++ spin_lock_irq(&syslog_lock); ++ latched_seq_write(&clear_seq, seq); ++ spin_unlock_irq(&syslog_lock); ++ } + + kfree(text); + return len; +@@ -1602,9 +1562,21 @@ static int syslog_print_all(char __user *buf, int size, bool clear) + + static void syslog_clear(void) + { +- logbuf_lock_irq(); +- clear_seq = prb_next_seq(prb); +- logbuf_unlock_irq(); ++ spin_lock_irq(&syslog_lock); ++ latched_seq_write(&clear_seq, prb_next_seq(prb)); ++ spin_unlock_irq(&syslog_lock); ++} ++ ++/* Return a consistent copy of @syslog_seq. */ ++static u64 read_syslog_seq_irq(void) ++{ ++ u64 seq; ++ ++ spin_lock_irq(&syslog_lock); ++ seq = syslog_seq; ++ spin_unlock_irq(&syslog_lock); ++ ++ return seq; + } + + int do_syslog(int type, char __user *buf, int len, int source) +@@ -1630,8 +1602,9 @@ int do_syslog(int type, char __user *buf, int len, int source) + return 0; + if (!access_ok(buf, len)) + return -EFAULT; ++ + error = wait_event_interruptible(log_wait, +- prb_read_valid(prb, syslog_seq, NULL)); ++ prb_read_valid(prb, read_syslog_seq_irq(), NULL)); + if (error) + return error; + error = syslog_print(buf, len); +@@ -1679,10 +1652,10 @@ int do_syslog(int type, char __user *buf, int len, int source) + break; + /* Number of chars in the log buffer */ + case SYSLOG_ACTION_SIZE_UNREAD: +- logbuf_lock_irq(); ++ spin_lock_irq(&syslog_lock); + if (!prb_read_valid_info(prb, syslog_seq, &info, NULL)) { + /* No unread messages. */ +- logbuf_unlock_irq(); ++ spin_unlock_irq(&syslog_lock); + return 0; + } + if (info.seq != syslog_seq) { +@@ -1710,7 +1683,7 @@ int do_syslog(int type, char __user *buf, int len, int source) + } + error -= syslog_partial; + } +- logbuf_unlock_irq(); ++ spin_unlock_irq(&syslog_lock); + break; + /* Size of the log buffer */ + case SYSLOG_ACTION_SIZE_BUFFER: +@@ -1729,20 +1702,114 @@ SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len) + return do_syslog(type, buf, len, SYSLOG_FROM_READER); + } + +-/* +- * Special console_lock variants that help to reduce the risk of soft-lockups. +- * They allow to pass console_lock to another printk() call using a busy wait. +- */ ++int printk_delay_msec __read_mostly; + +-#ifdef CONFIG_LOCKDEP +-static struct lockdep_map console_owner_dep_map = { +- .name = "console_owner" +-}; +-#endif ++static inline void printk_delay(int level) ++{ ++ boot_delay_msec(level); ++ ++ if (unlikely(printk_delay_msec)) { ++ int m = printk_delay_msec; ++ ++ while (m--) { ++ mdelay(1); ++ touch_nmi_watchdog(); ++ } ++ } ++} ++ ++static bool kernel_sync_mode(void) ++{ ++ return (oops_in_progress || sync_mode); ++} ++ ++static bool console_can_sync(struct console *con) ++{ ++ if (!(con->flags & CON_ENABLED)) ++ return false; ++ if (con->write_atomic && kernel_sync_mode()) ++ return true; ++ if (con->write_atomic && (con->flags & CON_HANDOVER) && !con->thread) ++ return true; ++ if (con->write && (con->flags & CON_BOOT) && !con->thread) ++ return true; ++ return false; ++} ++ ++static bool call_sync_console_driver(struct console *con, const char *text, size_t text_len) ++{ ++ if (!(con->flags & CON_ENABLED)) ++ return false; ++ if (con->write_atomic && kernel_sync_mode()) ++ con->write_atomic(con, text, text_len); ++ else if (con->write_atomic && (con->flags & CON_HANDOVER) && !con->thread) ++ con->write_atomic(con, text, text_len); ++ else if (con->write && (con->flags & CON_BOOT) && !con->thread) ++ con->write(con, text, text_len); ++ else ++ return false; ++ ++ return true; ++} ++ ++static bool have_atomic_console(void) ++{ ++ struct console *con; ++ ++ for_each_console(con) { ++ if (!(con->flags & CON_ENABLED)) ++ continue; ++ if (con->write_atomic) ++ return true; ++ } ++ return false; ++} ++ ++static bool print_sync(struct console *con, u64 *seq) ++{ ++ struct printk_info info; ++ struct printk_record r; ++ size_t text_len; ++ ++ prb_rec_init_rd(&r, &info, &con->sync_buf[0], sizeof(con->sync_buf)); ++ ++ if (!prb_read_valid(prb, *seq, &r)) ++ return false; ++ ++ text_len = record_print_text(&r, console_msg_format & MSG_FORMAT_SYSLOG, printk_time); ++ ++ if (!call_sync_console_driver(con, &con->sync_buf[0], text_len)) ++ return false; ++ ++ *seq = r.info->seq; ++ ++ touch_softlockup_watchdog_sync(); ++ clocksource_touch_watchdog(); ++ rcu_cpu_stall_reset(); ++ touch_nmi_watchdog(); ++ ++ if (text_len) ++ printk_delay(r.info->level); ++ ++ return true; ++} ++ ++static void print_sync_until(struct console *con, u64 seq) ++{ ++ unsigned int flags; ++ u64 printk_seq; + +-static DEFINE_RAW_SPINLOCK(console_owner_lock); +-static struct task_struct *console_owner; +-static bool console_waiter; ++ console_atomic_lock(&flags); ++ for (;;) { ++ printk_seq = atomic64_read(&con->printk_seq); ++ if (printk_seq >= seq) ++ break; ++ if (!print_sync(con, &printk_seq)) ++ break; ++ atomic64_set(&con->printk_seq, printk_seq + 1); ++ } ++ console_atomic_unlock(flags); ++} + + #if defined(CONFIG_X86) || defined(CONFIG_ARM64_PSEUDO_NMI) + void zap_locks(void) +@@ -1763,272 +1830,269 @@ void zap_locks(void) + } + #endif + +-/** +- * console_lock_spinning_enable - mark beginning of code where another +- * thread might safely busy wait +- * +- * This basically converts console_lock into a spinlock. This marks +- * the section where the console_lock owner can not sleep, because +- * there may be a waiter spinning (like a spinlock). Also it must be +- * ready to hand over the lock at the end of the section. +- */ +-static void console_lock_spinning_enable(void) +-{ +- raw_spin_lock(&console_owner_lock); +- console_owner = current; +- raw_spin_unlock(&console_owner_lock); ++#ifdef CONFIG_PRINTK_NMI ++#define NUM_RECURSION_CTX 2 ++#else ++#define NUM_RECURSION_CTX 1 ++#endif + +- /* The waiter may spin on us after setting console_owner */ +- spin_acquire(&console_owner_dep_map, 0, 0, _THIS_IP_); +-} ++struct printk_recursion { ++ char count[NUM_RECURSION_CTX]; ++}; + +-/** +- * console_lock_spinning_disable_and_check - mark end of code where another +- * thread was able to busy wait and check if there is a waiter +- * +- * This is called at the end of the section where spinning is allowed. +- * It has two functions. First, it is a signal that it is no longer +- * safe to start busy waiting for the lock. Second, it checks if +- * there is a busy waiter and passes the lock rights to her. +- * +- * Important: Callers lose the lock if there was a busy waiter. +- * They must not touch items synchronized by console_lock +- * in this case. +- * +- * Return: 1 if the lock rights were passed, 0 otherwise. +- */ +-static int console_lock_spinning_disable_and_check(void) ++static DEFINE_PER_CPU(struct printk_recursion, percpu_printk_recursion); ++static char printk_recursion_count[NUM_RECURSION_CTX]; ++ ++static char *printk_recursion_counter(void) + { +- int waiter; ++ struct printk_recursion *rec; ++ char *count; + +- raw_spin_lock(&console_owner_lock); +- waiter = READ_ONCE(console_waiter); +- console_owner = NULL; +- raw_spin_unlock(&console_owner_lock); ++ if (!printk_percpu_data_ready()) { ++ count = &printk_recursion_count[0]; ++ } else { ++ rec = this_cpu_ptr(&percpu_printk_recursion); + +- if (!waiter) { +- spin_release(&console_owner_dep_map, _THIS_IP_); +- return 0; ++ count = &rec->count[0]; + } + +- /* The waiter is now free to continue */ +- WRITE_ONCE(console_waiter, false); +- +- spin_release(&console_owner_dep_map, _THIS_IP_); ++#ifdef CONFIG_PRINTK_NMI ++ if (in_nmi()) ++ count++; ++#endif + +- /* +- * Hand off console_lock to waiter. The waiter will perform +- * the up(). After this, the waiter is the console_lock owner. +- */ +- mutex_release(&console_lock_dep_map, _THIS_IP_); +- return 1; ++ return count; + } + +-/** +- * console_trylock_spinning - try to get console_lock by busy waiting +- * +- * This allows to busy wait for the console_lock when the current +- * owner is running in specially marked sections. It means that +- * the current owner is running and cannot reschedule until it +- * is ready to lose the lock. +- * +- * Return: 1 if we got the lock, 0 othrewise +- */ +-static int console_trylock_spinning(void) ++static bool printk_enter_irqsave(unsigned long *flags) + { +- struct task_struct *owner = NULL; +- bool waiter; +- bool spin = false; +- unsigned long flags; +- +- if (console_trylock()) +- return 1; +- +- printk_safe_enter_irqsave(flags); ++ char *count; + +- raw_spin_lock(&console_owner_lock); +- owner = READ_ONCE(console_owner); +- waiter = READ_ONCE(console_waiter); +- if (!waiter && owner && owner != current) { +- WRITE_ONCE(console_waiter, true); +- spin = true; ++ local_irq_save(*flags); ++ count = printk_recursion_counter(); ++ /* Only 1 level of recursion allowed. */ ++ if (*count > 1) { ++ local_irq_restore(*flags); ++ return false; + } +- raw_spin_unlock(&console_owner_lock); ++ (*count)++; + +- /* +- * If there is an active printk() writing to the +- * consoles, instead of having it write our data too, +- * see if we can offload that load from the active +- * printer, and do some printing ourselves. +- * Go into a spin only if there isn't already a waiter +- * spinning, and there is an active printer, and +- * that active printer isn't us (recursive printk?). +- */ +- if (!spin) { +- printk_safe_exit_irqrestore(flags); +- return 0; +- } ++ return true; ++} + +- /* We spin waiting for the owner to release us */ +- spin_acquire(&console_owner_dep_map, 0, 0, _THIS_IP_); +- /* Owner will clear console_waiter on hand off */ +- while (READ_ONCE(console_waiter)) +- cpu_relax(); +- spin_release(&console_owner_dep_map, _THIS_IP_); ++static void printk_exit_irqrestore(unsigned long flags) ++{ ++ char *count; + +- printk_safe_exit_irqrestore(flags); +- /* +- * The owner passed the console lock to us. +- * Since we did not spin on console lock, annotate +- * this as a trylock. Otherwise lockdep will +- * complain. +- */ +- mutex_acquire(&console_lock_dep_map, 0, 1, _THIS_IP_); ++ count = printk_recursion_counter(); ++ (*count)--; ++ local_irq_restore(flags); ++} + +- return 1; ++static inline u32 printk_caller_id(void) ++{ ++ return in_task() ? task_pid_nr(current) : ++ 0x80000000 + raw_smp_processor_id(); + } + +-/* +- * Call the console drivers, asking them to write out +- * log_buf[start] to log_buf[end - 1]. +- * The console_lock must be held. ++/** ++ * parse_prefix - Parse level and control flags. ++ * ++ * @text: The terminated text message. ++ * @level: A pointer to the current level value, will be updated. ++ * @lflags: A pointer to the current log flags, will be updated. ++ * ++ * @level may be NULL if the caller is not interested in the parsed value. ++ * Otherwise the variable pointed to by @level must be set to ++ * LOGLEVEL_DEFAULT in order to be updated with the parsed value. ++ * ++ * @lflags may be NULL if the caller is not interested in the parsed value. ++ * Otherwise the variable pointed to by @lflags will be OR'd with the parsed ++ * value. ++ * ++ * Return: The length of the parsed level and control flags. + */ +-static void call_console_drivers(const char *ext_text, size_t ext_len, +- const char *text, size_t len) ++static u16 parse_prefix(char *text, int *level, enum log_flags *lflags) + { +- static char dropped_text[64]; +- size_t dropped_len = 0; +- struct console *con; ++ u16 prefix_len = 0; ++ int kern_level; + +- trace_console_rcuidle(text, len); ++ while (*text) { ++ kern_level = printk_get_level(text); ++ if (!kern_level) ++ break; + +- if (!console_drivers) +- return; ++ switch (kern_level) { ++ case '0' ... '7': ++ if (level && *level == LOGLEVEL_DEFAULT) ++ *level = kern_level - '0'; ++ break; ++ case 'c': /* KERN_CONT */ ++ if (lflags) ++ *lflags |= LOG_CONT; ++ } + +- if (console_dropped) { +- dropped_len = snprintf(dropped_text, sizeof(dropped_text), +- "** %lu printk messages dropped **\n", +- console_dropped); +- console_dropped = 0; ++ prefix_len += 2; ++ text += 2; + } + +- for_each_console(con) { +- if (exclusive_console && con != exclusive_console) +- continue; +- if (!(con->flags & CON_ENABLED)) +- continue; +- if (!con->write) +- continue; +- if (!cpu_online(smp_processor_id()) && +- !(con->flags & CON_ANYTIME)) +- continue; +- if (con->flags & CON_EXTENDED) +- con->write(con, ext_text, ext_len); +- else { +- if (dropped_len) +- con->write(con, dropped_text, dropped_len); +- con->write(con, text, len); +- } +- } ++ return prefix_len; + } + +-int printk_delay_msec __read_mostly; +- +-static inline void printk_delay(void) ++static u16 printk_sprint(char *text, u16 size, int facility, enum log_flags *lflags, ++ const char *fmt, va_list args) + { +- if (unlikely(printk_delay_msec)) { +- int m = printk_delay_msec; ++ u16 text_len; + +- while (m--) { +- mdelay(1); +- touch_nmi_watchdog(); ++ text_len = vscnprintf(text, size, fmt, args); ++ ++ /* Mark and strip a trailing newline. */ ++ if (text_len && text[text_len - 1] == '\n') { ++ text_len--; ++ *lflags |= LOG_NEWLINE; ++ } ++ ++ /* Strip log level and control flags. */ ++ if (facility == 0) { ++ u16 prefix_len; ++ ++ prefix_len = parse_prefix(text, NULL, NULL); ++ if (prefix_len) { ++ text_len -= prefix_len; ++ memmove(text, text + prefix_len, text_len); + } + } +-} + +-static inline u32 printk_caller_id(void) +-{ +- return in_task() ? task_pid_nr(current) : +- 0x80000000 + raw_smp_processor_id(); ++ return text_len; + } + +-static size_t log_output(int facility, int level, enum log_flags lflags, ++__printf(4, 0) ++static int vprintk_store(int facility, int level, + const struct dev_printk_info *dev_info, +- char *text, size_t text_len) ++ const char *fmt, va_list args) + { + const u32 caller_id = printk_caller_id(); +- +- if (lflags & LOG_CONT) { +- struct prb_reserved_entry e; +- struct printk_record r; +- +- prb_rec_init_wr(&r, text_len); +- if (prb_reserve_in_last(&e, prb, &r, caller_id, LOG_LINE_MAX)) { +- memcpy(&r.text_buf[r.info->text_len], text, text_len); ++ struct prb_reserved_entry e; ++ enum log_flags lflags = 0; ++ bool final_commit = false; ++ struct printk_record r; ++ unsigned long irqflags; ++ u16 trunc_msg_len = 0; ++ char prefix_buf[8]; ++ u16 reserve_size; ++ va_list args2; ++ u16 text_len; ++ int ret = 0; ++ u64 ts_nsec; ++ u64 seq; ++ ++ /* ++ * Since the duration of printk() can vary depending on the message ++ * and state of the ringbuffer, grab the timestamp now so that it is ++ * close to the call of printk(). This provides a more deterministic ++ * timestamp with respect to the caller. ++ */ ++ ts_nsec = local_clock(); ++ ++ if (!printk_enter_irqsave(&irqflags)) ++ return 0; ++ ++ /* ++ * The sprintf needs to come first since the syslog prefix might be ++ * passed in as a parameter. An extra byte must be reserved so that ++ * later the vscnprintf() into the reserved buffer has room for the ++ * terminating '\0', which is not counted by vsnprintf(). ++ */ ++ va_copy(args2, args); ++ reserve_size = vsnprintf(&prefix_buf[0], sizeof(prefix_buf), fmt, args2) + 1; ++ va_end(args2); ++ ++ if (reserve_size > LOG_LINE_MAX) ++ reserve_size = LOG_LINE_MAX; ++ ++ /* Extract log level or control flags. */ ++ if (facility == 0) ++ parse_prefix(&prefix_buf[0], &level, &lflags); ++ ++ if (level == LOGLEVEL_DEFAULT) ++ level = default_message_loglevel; ++ ++ if (dev_info) ++ lflags |= LOG_NEWLINE; ++ ++ if (lflags & LOG_CONT) { ++ prb_rec_init_wr(&r, reserve_size); ++ if (prb_reserve_in_last(&e, prb, &r, caller_id, LOG_LINE_MAX)) { ++ seq = r.info->seq; ++ text_len = printk_sprint(&r.text_buf[r.info->text_len], reserve_size, ++ facility, &lflags, fmt, args); + r.info->text_len += text_len; ++ + if (lflags & LOG_NEWLINE) { + r.info->flags |= LOG_NEWLINE; + prb_final_commit(&e); ++ final_commit = true; + } else { + prb_commit(&e); + } +- return text_len; ++ ++ ret = text_len; ++ goto out; + } + } + +- /* Store it in the record log */ +- return log_store(caller_id, facility, level, lflags, 0, +- dev_info, text, text_len); +-} +- +-/* Must be called under logbuf_lock. */ +-int vprintk_store(int facility, int level, +- const struct dev_printk_info *dev_info, +- const char *fmt, va_list args) +-{ +- static char textbuf[LOG_LINE_MAX]; +- char *text = textbuf; +- size_t text_len; +- enum log_flags lflags = 0; +- + /* +- * The printf needs to come first; we need the syslog +- * prefix which might be passed-in as a parameter. ++ * Explicitly initialize the record before every prb_reserve() call. ++ * prb_reserve_in_last() and prb_reserve() purposely invalidate the ++ * structure when they fail. + */ +- text_len = vscnprintf(text, sizeof(textbuf), fmt, args); ++ prb_rec_init_wr(&r, reserve_size); ++ if (!prb_reserve(&e, prb, &r)) { ++ /* truncate the message if it is too long for empty buffer */ ++ truncate_msg(&reserve_size, &trunc_msg_len); + +- /* mark and strip a trailing newline */ +- if (text_len && text[text_len-1] == '\n') { +- text_len--; +- lflags |= LOG_NEWLINE; ++ prb_rec_init_wr(&r, reserve_size + trunc_msg_len); ++ if (!prb_reserve(&e, prb, &r)) ++ goto out; + } + +- /* strip kernel syslog prefix and extract log level or control flags */ +- if (facility == 0) { +- int kern_level; ++ seq = r.info->seq; + +- while ((kern_level = printk_get_level(text)) != 0) { +- switch (kern_level) { +- case '0' ... '7': +- if (level == LOGLEVEL_DEFAULT) +- level = kern_level - '0'; +- break; +- case 'c': /* KERN_CONT */ +- lflags |= LOG_CONT; +- } ++ /* fill message */ ++ text_len = printk_sprint(&r.text_buf[0], reserve_size, facility, &lflags, fmt, args); ++ if (trunc_msg_len) ++ memcpy(&r.text_buf[text_len], trunc_msg, trunc_msg_len); ++ r.info->text_len = text_len + trunc_msg_len; ++ r.info->facility = facility; ++ r.info->level = level & 7; ++ r.info->flags = lflags & 0x1f; ++ r.info->ts_nsec = ts_nsec; ++ r.info->caller_id = caller_id; ++ if (dev_info) ++ memcpy(&r.info->dev_info, dev_info, sizeof(r.info->dev_info)); + +- text_len -= 2; +- text += 2; +- } ++ /* A message without a trailing newline can be continued. */ ++ if (!(lflags & LOG_NEWLINE)) { ++ prb_commit(&e); ++ } else { ++ prb_final_commit(&e); ++ final_commit = true; + } + +- if (level == LOGLEVEL_DEFAULT) +- level = default_message_loglevel; ++ ret = text_len + trunc_msg_len; ++out: ++ /* only the kernel may perform synchronous printing */ ++ if (facility == 0 && final_commit) { ++ struct console *con; + +- if (dev_info) +- lflags |= LOG_NEWLINE; ++ for_each_console(con) { ++ if (console_can_sync(con)) ++ print_sync_until(con, seq + 1); ++ } ++ } + +- return log_output(facility, level, lflags, dev_info, text, text_len); ++ printk_exit_irqrestore(irqflags); ++ return ret; + } + + asmlinkage int vprintk_emit(int facility, int level, +@@ -2036,60 +2100,43 @@ asmlinkage int vprintk_emit(int facility, int level, + const char *fmt, va_list args) + { + int printed_len; +- bool in_sched = false; +- unsigned long flags; + + /* Suppress unimportant messages after panic happens */ + if (unlikely(suppress_printk)) + return 0; + +- if (level == LOGLEVEL_SCHED) { ++ if (level == LOGLEVEL_SCHED) + level = LOGLEVEL_DEFAULT; +- in_sched = true; +- } +- +- boot_delay_msec(level); +- printk_delay(); + +- /* This stops the holder of console_sem just where we want him */ +- logbuf_lock_irqsave(flags); + printed_len = vprintk_store(facility, level, dev_info, fmt, args); +- logbuf_unlock_irqrestore(flags); +- +- /* If called from the scheduler, we can not call up(). */ +- if (!in_sched) { +- /* +- * Disable preemption to avoid being preempted while holding +- * console_sem which would prevent anyone from printing to +- * console +- */ +- preempt_disable(); +- /* +- * Try to acquire and then immediately release the console +- * semaphore. The release will print out buffers and wake up +- * /dev/kmsg and syslog() users. +- */ +- if (console_trylock_spinning()) +- console_unlock(); +- preempt_enable(); +- } + + wake_up_klogd(); + return printed_len; + } + EXPORT_SYMBOL(vprintk_emit); + +-asmlinkage int vprintk(const char *fmt, va_list args) ++__printf(1, 0) ++static int vprintk_default(const char *fmt, va_list args) + { +- return vprintk_func(fmt, args); ++ return vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, fmt, args); + } +-EXPORT_SYMBOL(vprintk); + +-int vprintk_default(const char *fmt, va_list args) ++__printf(1, 0) ++static int vprintk_func(const char *fmt, va_list args) + { +- return vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, fmt, args); ++#ifdef CONFIG_KGDB_KDB ++ /* Allow to pass printk() to kdb but avoid a recursion. */ ++ if (unlikely(kdb_trap_printk && kdb_printf_cpu < 0)) ++ return vkdb_printf(KDB_MSGSRC_PRINTK, fmt, args); ++#endif ++ return vprintk_default(fmt, args); + } +-EXPORT_SYMBOL_GPL(vprintk_default); ++ ++asmlinkage int vprintk(const char *fmt, va_list args) ++{ ++ return vprintk_func(fmt, args); ++} ++EXPORT_SYMBOL(vprintk); + + /** + * printk - print a kernel message +@@ -2125,38 +2172,158 @@ asmlinkage __visible int printk(const char *fmt, ...) + } + EXPORT_SYMBOL(printk); + +-#else /* CONFIG_PRINTK */ ++static int printk_kthread_func(void *data) ++{ ++ struct console *con = data; ++ unsigned long dropped = 0; ++ char *dropped_text = NULL; ++ struct printk_info info; ++ struct printk_record r; ++ char *ext_text = NULL; ++ size_t dropped_len; ++ int ret = -ENOMEM; ++ char *text = NULL; ++ char *write_text; ++ u64 printk_seq; ++ size_t len; ++ int error; ++ u64 seq; + +-#define LOG_LINE_MAX 0 +-#define PREFIX_MAX 0 +-#define printk_time false ++ if (con->flags & CON_EXTENDED) { ++ ext_text = kmalloc(CONSOLE_EXT_LOG_MAX, GFP_KERNEL); ++ if (!ext_text) ++ goto out; ++ } ++ text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL); ++ dropped_text = kmalloc(64, GFP_KERNEL); ++ if (!text || !dropped_text) ++ goto out; + +-#define prb_read_valid(rb, seq, r) false +-#define prb_first_valid_seq(rb) 0 ++ if (con->flags & CON_EXTENDED) ++ write_text = ext_text; ++ else ++ write_text = text; + +-static u64 syslog_seq; +-static u64 console_seq; +-static u64 exclusive_console_stop_seq; +-static unsigned long console_dropped; ++ seq = atomic64_read(&con->printk_seq); + +-static size_t record_print_text(const struct printk_record *r, +- bool syslog, bool time) ++ prb_rec_init_rd(&r, &info, text, LOG_LINE_MAX + PREFIX_MAX); ++ ++ for (;;) { ++ error = wait_event_interruptible(log_wait, ++ prb_read_valid(prb, seq, &r) || kthread_should_stop()); ++ ++ if (kthread_should_stop()) ++ break; ++ ++ if (error) ++ continue; ++ ++ if (seq != r.info->seq) { ++ dropped += r.info->seq - seq; ++ seq = r.info->seq; ++ } ++ ++ seq++; ++ ++ if (!(con->flags & CON_ENABLED)) ++ continue; ++ ++ if (suppress_message_printing(r.info->level)) ++ continue; ++ ++ if (con->flags & CON_EXTENDED) { ++ len = info_print_ext_header(ext_text, ++ CONSOLE_EXT_LOG_MAX, ++ r.info); ++ len += msg_print_ext_body(ext_text + len, ++ CONSOLE_EXT_LOG_MAX - len, ++ &r.text_buf[0], r.info->text_len, ++ &r.info->dev_info); ++ } else { ++ len = record_print_text(&r, ++ console_msg_format & MSG_FORMAT_SYSLOG, ++ printk_time); ++ } ++ ++ printk_seq = atomic64_read(&con->printk_seq); ++ ++ console_lock(); ++ console_may_schedule = 0; ++ ++ if (kernel_sync_mode() && con->write_atomic) { ++ console_unlock(); ++ break; ++ } ++ ++ if (!(con->flags & CON_EXTENDED) && dropped) { ++ dropped_len = snprintf(dropped_text, 64, ++ "** %lu printk messages dropped **\n", ++ dropped); ++ dropped = 0; ++ ++ con->write(con, dropped_text, dropped_len); ++ printk_delay(r.info->level); ++ } ++ ++ con->write(con, write_text, len); ++ if (len) ++ printk_delay(r.info->level); ++ ++ atomic64_cmpxchg_relaxed(&con->printk_seq, printk_seq, seq); ++ ++ console_unlock(); ++ } ++out: ++ kfree(dropped_text); ++ kfree(text); ++ kfree(ext_text); ++ pr_info("%sconsole [%s%d]: printing thread stopped\n", ++ (con->flags & CON_BOOT) ? "boot" : "", ++ con->name, con->index); ++ return ret; ++} ++ ++/* Must be called within console_lock(). */ ++static void start_printk_kthread(struct console *con) + { +- return 0; ++ con->thread = kthread_run(printk_kthread_func, con, ++ "pr/%s%d", con->name, con->index); ++ if (IS_ERR(con->thread)) { ++ pr_err("%sconsole [%s%d]: unable to start printing thread\n", ++ (con->flags & CON_BOOT) ? "boot" : "", ++ con->name, con->index); ++ return; ++ } ++ pr_info("%sconsole [%s%d]: printing thread started\n", ++ (con->flags & CON_BOOT) ? "boot" : "", ++ con->name, con->index); + } +-static ssize_t info_print_ext_header(char *buf, size_t size, +- struct printk_info *info) ++ ++/* protected by console_lock */ ++static bool kthreads_started; ++ ++/* Must be called within console_lock(). */ ++static void console_try_thread(struct console *con) + { +- return 0; ++ if (kthreads_started) { ++ start_printk_kthread(con); ++ return; ++ } ++ ++ /* ++ * The printing threads have not been started yet. If this console ++ * can print synchronously, print all unprinted messages. ++ */ ++ if (console_can_sync(con)) ++ print_sync_until(con, prb_next_seq(prb)); + } +-static ssize_t msg_print_ext_body(char *buf, size_t size, +- char *text, size_t text_len, +- struct dev_printk_info *dev_info) { return 0; } +-static void console_lock_spinning_enable(void) { } +-static int console_lock_spinning_disable_and_check(void) { return 0; } +-static void call_console_drivers(const char *ext_text, size_t ext_len, +- const char *text, size_t len) {} +-static bool suppress_message_printing(int level) { return false; } ++ ++#else /* CONFIG_PRINTK */ ++ ++#define prb_first_valid_seq(rb) 0 ++#define prb_next_seq(rb) 0 ++ ++#define console_try_thread(con) + + #endif /* CONFIG_PRINTK */ + +@@ -2401,34 +2568,6 @@ int is_console_locked(void) + } + EXPORT_SYMBOL(is_console_locked); + +-/* +- * Check if we have any console that is capable of printing while cpu is +- * booting or shutting down. Requires console_sem. +- */ +-static int have_callable_console(void) +-{ +- struct console *con; +- +- for_each_console(con) +- if ((con->flags & CON_ENABLED) && +- (con->flags & CON_ANYTIME)) +- return 1; +- +- return 0; +-} +- +-/* +- * Can we actually use the console at this time on this cpu? +- * +- * Console drivers may assume that per-cpu resources have been allocated. So +- * unless they're explicitly marked as being able to cope (CON_ANYTIME) don't +- * call them until this CPU is officially up. +- */ +-static inline int can_use_console(void) +-{ +- return cpu_online(raw_smp_processor_id()) || have_callable_console(); +-} +- + /** + * console_unlock - unlock the console system + * +@@ -2445,142 +2584,14 @@ static inline int can_use_console(void) + */ + void console_unlock(void) + { +- static char ext_text[CONSOLE_EXT_LOG_MAX]; +- static char text[LOG_LINE_MAX + PREFIX_MAX]; +- unsigned long flags; +- bool do_cond_resched, retry; +- struct printk_info info; +- struct printk_record r; +- + if (console_suspended) { + up_console_sem(); + return; + } + +- prb_rec_init_rd(&r, &info, text, sizeof(text)); +- +- /* +- * Console drivers are called with interrupts disabled, so +- * @console_may_schedule should be cleared before; however, we may +- * end up dumping a lot of lines, for example, if called from +- * console registration path, and should invoke cond_resched() +- * between lines if allowable. Not doing so can cause a very long +- * scheduling stall on a slow console leading to RCU stall and +- * softlockup warnings which exacerbate the issue with more +- * messages practically incapacitating the system. +- * +- * console_trylock() is not able to detect the preemptive +- * context reliably. Therefore the value must be stored before +- * and cleared after the "again" goto label. +- */ +- do_cond_resched = console_may_schedule; +-again: +- console_may_schedule = 0; +- +- /* +- * We released the console_sem lock, so we need to recheck if +- * cpu is online and (if not) is there at least one CON_ANYTIME +- * console. +- */ +- if (!can_use_console()) { +- console_locked = 0; +- up_console_sem(); +- return; +- } +- +- for (;;) { +- size_t ext_len = 0; +- size_t len; +- +- printk_safe_enter_irqsave(flags); +- raw_spin_lock(&logbuf_lock); +-skip: +- if (!prb_read_valid(prb, console_seq, &r)) +- break; +- +- if (console_seq != r.info->seq) { +- console_dropped += r.info->seq - console_seq; +- console_seq = r.info->seq; +- } +- +- if (suppress_message_printing(r.info->level)) { +- /* +- * Skip record we have buffered and already printed +- * directly to the console when we received it, and +- * record that has level above the console loglevel. +- */ +- console_seq++; +- goto skip; +- } +- +- /* Output to all consoles once old messages replayed. */ +- if (unlikely(exclusive_console && +- console_seq >= exclusive_console_stop_seq)) { +- exclusive_console = NULL; +- } +- +- /* +- * Handle extended console text first because later +- * record_print_text() will modify the record buffer in-place. +- */ +- if (nr_ext_console_drivers) { +- ext_len = info_print_ext_header(ext_text, +- sizeof(ext_text), +- r.info); +- ext_len += msg_print_ext_body(ext_text + ext_len, +- sizeof(ext_text) - ext_len, +- &r.text_buf[0], +- r.info->text_len, +- &r.info->dev_info); +- } +- len = record_print_text(&r, +- console_msg_format & MSG_FORMAT_SYSLOG, +- printk_time); +- console_seq++; +- raw_spin_unlock(&logbuf_lock); +- +- /* +- * While actively printing out messages, if another printk() +- * were to occur on another CPU, it may wait for this one to +- * finish. This task can not be preempted if there is a +- * waiter waiting to take over. +- */ +- console_lock_spinning_enable(); +- +- stop_critical_timings(); /* don't trace print latency */ +- call_console_drivers(ext_text, ext_len, text, len); +- start_critical_timings(); +- +- if (console_lock_spinning_disable_and_check()) { +- printk_safe_exit_irqrestore(flags); +- return; +- } +- +- printk_safe_exit_irqrestore(flags); +- +- if (do_cond_resched) +- cond_resched(); +- } +- + console_locked = 0; + +- raw_spin_unlock(&logbuf_lock); +- + up_console_sem(); +- +- /* +- * Someone could have filled up the buffer again, so re-check if there's +- * something to flush. In case we cannot trylock the console_sem again, +- * there's a new owner and the console_unlock() from them will do the +- * flush, no worries. +- */ +- raw_spin_lock(&logbuf_lock); +- retry = prb_read_valid(prb, console_seq, NULL); +- raw_spin_unlock(&logbuf_lock); +- printk_safe_exit_irqrestore(flags); +- +- if (retry && console_trylock()) +- goto again; + } + EXPORT_SYMBOL(console_unlock); + +@@ -2630,23 +2641,20 @@ void console_unblank(void) + */ + void console_flush_on_panic(enum con_flush_mode mode) + { +- /* +- * If someone else is holding the console lock, trylock will fail +- * and may_schedule may be set. Ignore and proceed to unlock so +- * that messages are flushed out. As this can be called from any +- * context and we don't want to get preempted while flushing, +- * ensure may_schedule is cleared. +- */ +- console_trylock(); ++ struct console *c; ++ u64 seq; ++ ++ if (!console_trylock()) ++ return; ++ + console_may_schedule = 0; + +- if (mode == CONSOLE_REPLAY_ALL) { +- unsigned long flags; ++ if (mode == CONSOLE_REPLAY_ALL) { ++ seq = prb_first_valid_seq(prb); ++ for_each_console(c) ++ atomic64_set(&c->printk_seq, seq); ++ } + +- logbuf_lock_irqsave(flags); +- console_seq = prb_first_valid_seq(prb); +- logbuf_unlock_irqrestore(flags); +- } + console_unlock(); + } + EXPORT_SYMBOL(console_flush_on_panic); +@@ -2782,7 +2790,6 @@ static int try_enable_new_console(struct console *newcon, bool user_specified) + */ + void register_console(struct console *newcon) + { +- unsigned long flags; + struct console *bcon = NULL; + int err; + +@@ -2806,6 +2813,8 @@ void register_console(struct console *newcon) + } + } + ++ newcon->thread = NULL; ++ + if (console_drivers && console_drivers->flags & CON_BOOT) + bcon = console_drivers; + +@@ -2847,8 +2856,10 @@ void register_console(struct console *newcon) + * the real console are the same physical device, it's annoying to + * see the beginning boot messages twice + */ +- if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) ++ if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) { + newcon->flags &= ~CON_PRINTBUFFER; ++ newcon->flags |= CON_HANDOVER; ++ } + + /* + * Put this console in the list - keep the +@@ -2870,26 +2881,12 @@ void register_console(struct console *newcon) + if (newcon->flags & CON_EXTENDED) + nr_ext_console_drivers++; + +- if (newcon->flags & CON_PRINTBUFFER) { +- /* +- * console_unlock(); will print out the buffered messages +- * for us. +- */ +- logbuf_lock_irqsave(flags); +- /* +- * We're about to replay the log buffer. Only do this to the +- * just-registered console to avoid excessive message spam to +- * the already-registered consoles. +- * +- * Set exclusive_console with disabled interrupts to reduce +- * race window with eventual console_flush_on_panic() that +- * ignores console_lock. +- */ +- exclusive_console = newcon; +- exclusive_console_stop_seq = console_seq; +- console_seq = syslog_seq; +- logbuf_unlock_irqrestore(flags); +- } ++ if (newcon->flags & CON_PRINTBUFFER) ++ atomic64_set(&newcon->printk_seq, 0); ++ else ++ atomic64_set(&newcon->printk_seq, prb_next_seq(prb)); ++ ++ console_try_thread(newcon); + console_unlock(); + console_sysfs_notify(); + +@@ -2963,6 +2960,9 @@ int unregister_console(struct console *console) + console_unlock(); + console_sysfs_notify(); + ++ if (console->thread && !IS_ERR(console->thread)) ++ kthread_stop(console->thread); ++ + if (console->exit) + res = console->exit(console); + +@@ -3045,6 +3045,15 @@ static int __init printk_late_init(void) + unregister_console(con); + } + } ++ ++#ifdef CONFIG_PRINTK ++ console_lock(); ++ for_each_console(con) ++ start_printk_kthread(con); ++ kthreads_started = true; ++ console_unlock(); ++#endif ++ + ret = cpuhp_setup_state_nocalls(CPUHP_PRINTK_DEAD, "printk:dead", NULL, + console_cpu_notify); + WARN_ON(ret < 0); +@@ -3060,7 +3069,6 @@ late_initcall(printk_late_init); + * Delayed printk version, for scheduler-internal messages: + */ + #define PRINTK_PENDING_WAKEUP 0x01 +-#define PRINTK_PENDING_OUTPUT 0x02 + + static DEFINE_PER_CPU(int, printk_pending); + +@@ -3068,14 +3076,8 @@ static void wake_up_klogd_work_func(struct irq_work *irq_work) + { + int pending = __this_cpu_xchg(printk_pending, 0); + +- if (pending & PRINTK_PENDING_OUTPUT) { +- /* If trylock fails, someone else is doing the printing */ +- if (console_trylock()) +- console_unlock(); +- } +- + if (pending & PRINTK_PENDING_WAKEUP) +- wake_up_interruptible(&log_wait); ++ wake_up_interruptible_all(&log_wait); + } + + static DEFINE_PER_CPU(struct irq_work, wake_up_klogd_work) = +@@ -3094,25 +3096,10 @@ void wake_up_klogd(void) + preempt_enable(); + } + +-void defer_console_output(void) ++__printf(1, 0) ++static int vprintk_deferred(const char *fmt, va_list args) + { +- if (!printk_percpu_data_ready()) +- return; +- +- preempt_disable(); +- __this_cpu_or(printk_pending, PRINTK_PENDING_OUTPUT); +- irq_work_queue(this_cpu_ptr(&wake_up_klogd_work)); +- preempt_enable(); +-} +- +-int vprintk_deferred(const char *fmt, va_list args) +-{ +- int r; +- +- r = vprintk_emit(0, LOGLEVEL_SCHED, NULL, fmt, args); +- defer_console_output(); +- +- return r; ++ return vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, fmt, args); + } + + int printk_deferred(const char *fmt, ...) +@@ -3251,8 +3238,26 @@ EXPORT_SYMBOL_GPL(kmsg_dump_reason_str); + */ + void kmsg_dump(enum kmsg_dump_reason reason) + { ++ struct kmsg_dumper_iter iter; + struct kmsg_dumper *dumper; +- unsigned long flags; ++ ++ if (!oops_in_progress) { ++ /* ++ * If atomic consoles are available, activate kernel sync mode ++ * to make sure any final messages are visible. The trailing ++ * printk message is important to flush any pending messages. ++ */ ++ if (have_atomic_console()) { ++ sync_mode = true; ++ pr_info("enabled sync mode\n"); ++ } ++ ++ /* ++ * Give the printing threads time to flush, allowing up to ++ * 1s of no printing forward progress before giving up. ++ */ ++ pr_flush(1000, true); ++ } + + rcu_read_lock(); + list_for_each_entry_rcu(dumper, &dump_list, list) { +@@ -3270,25 +3275,18 @@ void kmsg_dump(enum kmsg_dump_reason reason) + continue; + + /* initialize iterator with data about the stored records */ +- dumper->active = true; +- +- logbuf_lock_irqsave(flags); +- dumper->cur_seq = clear_seq; +- dumper->next_seq = prb_next_seq(prb); +- logbuf_unlock_irqrestore(flags); ++ iter.active = true; ++ kmsg_dump_rewind(&iter); + + /* invoke dumper which will iterate over records */ +- dumper->dump(dumper, reason); +- +- /* reset iterator */ +- dumper->active = false; ++ dumper->dump(dumper, reason, &iter); + } + rcu_read_unlock(); + } + + /** +- * kmsg_dump_get_line_nolock - retrieve one kmsg log line (unlocked version) +- * @dumper: registered kmsg dumper ++ * kmsg_dump_get_line - retrieve one kmsg log line ++ * @iter: kmsg dumper iterator + * @syslog: include the "<4>" prefixes + * @line: buffer to copy the line to + * @size: maximum size of the buffer +@@ -3302,11 +3300,9 @@ void kmsg_dump(enum kmsg_dump_reason reason) + * + * A return value of FALSE indicates that there are no more records to + * read. +- * +- * The function is similar to kmsg_dump_get_line(), but grabs no locks. + */ +-bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, bool syslog, +- char *line, size_t size, size_t *len) ++bool kmsg_dump_get_line(struct kmsg_dumper_iter *iter, bool syslog, ++ char *line, size_t size, size_t *len) + { + struct printk_info info; + unsigned int line_count; +@@ -3316,16 +3312,16 @@ bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, bool syslog, + + prb_rec_init_rd(&r, &info, line, size); + +- if (!dumper->active) ++ if (!iter->active) + goto out; + + /* Read text or count text lines? */ + if (line) { +- if (!prb_read_valid(prb, dumper->cur_seq, &r)) ++ if (!prb_read_valid(prb, iter->cur_seq, &r)) + goto out; + l = record_print_text(&r, syslog, printk_time); + } else { +- if (!prb_read_valid_info(prb, dumper->cur_seq, ++ if (!prb_read_valid_info(prb, iter->cur_seq, + &info, &line_count)) { + goto out; + } +@@ -3334,48 +3330,18 @@ bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, bool syslog, + + } + +- dumper->cur_seq = r.info->seq + 1; ++ iter->cur_seq = r.info->seq + 1; + ret = true; + out: + if (len) + *len = l; + return ret; + } +- +-/** +- * kmsg_dump_get_line - retrieve one kmsg log line +- * @dumper: registered kmsg dumper +- * @syslog: include the "<4>" prefixes +- * @line: buffer to copy the line to +- * @size: maximum size of the buffer +- * @len: length of line placed into buffer +- * +- * Start at the beginning of the kmsg buffer, with the oldest kmsg +- * record, and copy one record into the provided buffer. +- * +- * Consecutive calls will return the next available record moving +- * towards the end of the buffer with the youngest messages. +- * +- * A return value of FALSE indicates that there are no more records to +- * read. +- */ +-bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog, +- char *line, size_t size, size_t *len) +-{ +- unsigned long flags; +- bool ret; +- +- logbuf_lock_irqsave(flags); +- ret = kmsg_dump_get_line_nolock(dumper, syslog, line, size, len); +- logbuf_unlock_irqrestore(flags); +- +- return ret; +-} + EXPORT_SYMBOL_GPL(kmsg_dump_get_line); + + /** + * kmsg_dump_get_buffer - copy kmsg log lines +- * @dumper: registered kmsg dumper ++ * @iter: kmsg dumper iterator + * @syslog: include the "<4>" prefixes + * @buf: buffer to copy the line to + * @size: maximum size of the buffer +@@ -3392,116 +3358,256 @@ EXPORT_SYMBOL_GPL(kmsg_dump_get_line); + * A return value of FALSE indicates that there are no more records to + * read. + */ +-bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog, +- char *buf, size_t size, size_t *len) ++bool kmsg_dump_get_buffer(struct kmsg_dumper_iter *iter, bool syslog, ++ char *buf, size_t size, size_t *len_out) + { + struct printk_info info; +- unsigned int line_count; + struct printk_record r; +- unsigned long flags; + u64 seq; + u64 next_seq; +- size_t l = 0; ++ size_t len = 0; + bool ret = false; + bool time = printk_time; + +- prb_rec_init_rd(&r, &info, buf, size); +- +- if (!dumper->active || !buf || !size) ++ if (!iter->active || !buf || !size) + goto out; + +- logbuf_lock_irqsave(flags); +- if (prb_read_valid_info(prb, dumper->cur_seq, &info, NULL)) { +- if (info.seq != dumper->cur_seq) { ++ if (prb_read_valid_info(prb, iter->cur_seq, &info, NULL)) { ++ if (info.seq != iter->cur_seq) { + /* messages are gone, move to first available one */ +- dumper->cur_seq = info.seq; ++ iter->cur_seq = info.seq; + } + } + + /* last entry */ +- if (dumper->cur_seq >= dumper->next_seq) { +- logbuf_unlock_irqrestore(flags); ++ if (iter->cur_seq >= iter->next_seq) + goto out; +- } + +- /* calculate length of entire buffer */ +- seq = dumper->cur_seq; +- while (prb_read_valid_info(prb, seq, &info, &line_count)) { +- if (r.info->seq >= dumper->next_seq) +- break; +- l += get_record_print_text_size(&info, line_count, syslog, time); +- seq = r.info->seq + 1; +- } +- +- /* move first record forward until length fits into the buffer */ +- seq = dumper->cur_seq; +- while (l >= size && prb_read_valid_info(prb, seq, +- &info, &line_count)) { +- if (r.info->seq >= dumper->next_seq) +- break; +- l -= get_record_print_text_size(&info, line_count, syslog, time); +- seq = r.info->seq + 1; +- } ++ /* ++ * Find first record that fits, including all following records, ++ * into the user-provided buffer for this dump. Pass in size-1 ++ * because this function (by way of record_print_text()) will ++ * not write more than size-1 bytes of text into @buf. ++ */ ++ seq = find_first_fitting_seq(iter->cur_seq, iter->next_seq, ++ size - 1, syslog, time); + +- /* last message in next interation */ ++ /* ++ * Next kmsg_dump_get_buffer() invocation will dump block of ++ * older records stored right before this one. ++ */ + next_seq = seq; + +- /* actually read text into the buffer now */ +- l = 0; +- while (prb_read_valid(prb, seq, &r)) { +- if (r.info->seq >= dumper->next_seq) +- break; ++ prb_rec_init_rd(&r, &info, buf, size); + +- l += record_print_text(&r, syslog, time); ++ len = 0; ++ prb_for_each_record(seq, prb, seq, &r) { ++ if (r.info->seq >= iter->next_seq) ++ break; + +- /* adjust record to store to remaining buffer space */ +- prb_rec_init_rd(&r, &info, buf + l, size - l); ++ len += record_print_text(&r, syslog, time); + +- seq = r.info->seq + 1; ++ /* Adjust record to store to remaining buffer space. */ ++ prb_rec_init_rd(&r, &info, buf + len, size - len); + } + +- dumper->next_seq = next_seq; ++ iter->next_seq = next_seq; + ret = true; +- logbuf_unlock_irqrestore(flags); + out: +- if (len) +- *len = l; ++ if (len_out) ++ *len_out = len; + return ret; + } + EXPORT_SYMBOL_GPL(kmsg_dump_get_buffer); + + /** +- * kmsg_dump_rewind_nolock - reset the iterator (unlocked version) +- * @dumper: registered kmsg dumper ++ * kmsg_dump_rewind - reset the iterator ++ * @iter: kmsg dumper iterator + * + * Reset the dumper's iterator so that kmsg_dump_get_line() and + * kmsg_dump_get_buffer() can be called again and used multiple + * times within the same dumper.dump() callback. ++ */ ++void kmsg_dump_rewind(struct kmsg_dumper_iter *iter) ++{ ++ iter->cur_seq = latched_seq_read_nolock(&clear_seq); ++ iter->next_seq = prb_next_seq(prb); ++} ++EXPORT_SYMBOL_GPL(kmsg_dump_rewind); ++ ++#endif ++ ++struct prb_cpulock { ++ atomic_t owner; ++ unsigned long __percpu *irqflags; ++}; ++ ++#define DECLARE_STATIC_PRINTKRB_CPULOCK(name) \ ++static DEFINE_PER_CPU(unsigned long, _##name##_percpu_irqflags); \ ++static struct prb_cpulock name = { \ ++ .owner = ATOMIC_INIT(-1), \ ++ .irqflags = &_##name##_percpu_irqflags, \ ++} ++ ++static bool __prb_trylock(struct prb_cpulock *cpu_lock, ++ unsigned int *cpu_store) ++{ ++ unsigned long *flags; ++ unsigned int cpu; ++ ++ cpu = get_cpu(); ++ ++ *cpu_store = atomic_read(&cpu_lock->owner); ++ /* memory barrier to ensure the current lock owner is visible */ ++ smp_rmb(); ++ if (*cpu_store == -1) { ++ flags = per_cpu_ptr(cpu_lock->irqflags, cpu); ++ local_irq_save(*flags); ++ if (atomic_try_cmpxchg_acquire(&cpu_lock->owner, ++ cpu_store, cpu)) { ++ return true; ++ } ++ local_irq_restore(*flags); ++ } else if (*cpu_store == cpu) { ++ return true; ++ } ++ ++ put_cpu(); ++ return false; ++} ++ ++/* ++ * prb_lock: Perform a processor-reentrant spin lock. ++ * @cpu_lock: A pointer to the lock object. ++ * @cpu_store: A "flags" pointer to store lock status information. + * +- * The function is similar to kmsg_dump_rewind(), but grabs no locks. ++ * If no processor has the lock, the calling processor takes the lock and ++ * becomes the owner. If the calling processor is already the owner of the ++ * lock, this function succeeds immediately. If lock is locked by another ++ * processor, this function spins until the calling processor becomes the ++ * owner. ++ * ++ * It is safe to call this function from any context and state. + */ +-void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper) ++static void prb_lock(struct prb_cpulock *cpu_lock, unsigned int *cpu_store) + { +- dumper->cur_seq = clear_seq; +- dumper->next_seq = prb_next_seq(prb); ++ for (;;) { ++ if (__prb_trylock(cpu_lock, cpu_store)) ++ break; ++ cpu_relax(); ++ } + } + +-/** +- * kmsg_dump_rewind - reset the iterator +- * @dumper: registered kmsg dumper ++/* ++ * prb_unlock: Perform a processor-reentrant spin unlock. ++ * @cpu_lock: A pointer to the lock object. ++ * @cpu_store: A "flags" object storing lock status information. + * +- * Reset the dumper's iterator so that kmsg_dump_get_line() and +- * kmsg_dump_get_buffer() can be called again and used multiple +- * times within the same dumper.dump() callback. ++ * Release the lock. The calling processor must be the owner of the lock. ++ * ++ * It is safe to call this function from any context and state. + */ +-void kmsg_dump_rewind(struct kmsg_dumper *dumper) ++static void prb_unlock(struct prb_cpulock *cpu_lock, unsigned int cpu_store) + { +- unsigned long flags; ++ unsigned long *flags; ++ unsigned int cpu; + +- logbuf_lock_irqsave(flags); +- kmsg_dump_rewind_nolock(dumper); +- logbuf_unlock_irqrestore(flags); ++ cpu = atomic_read(&cpu_lock->owner); ++ atomic_set_release(&cpu_lock->owner, cpu_store); ++ ++ if (cpu_store == -1) { ++ flags = per_cpu_ptr(cpu_lock->irqflags, cpu); ++ local_irq_restore(*flags); ++ } ++ ++ put_cpu(); + } +-EXPORT_SYMBOL_GPL(kmsg_dump_rewind); + +-#endif ++DECLARE_STATIC_PRINTKRB_CPULOCK(printk_cpulock); ++ ++void console_atomic_lock(unsigned int *flags) ++{ ++ prb_lock(&printk_cpulock, flags); ++} ++EXPORT_SYMBOL(console_atomic_lock); ++ ++void console_atomic_unlock(unsigned int flags) ++{ ++ prb_unlock(&printk_cpulock, flags); ++} ++EXPORT_SYMBOL(console_atomic_unlock); ++ ++static void pr_msleep(bool may_sleep, int ms) ++{ ++ if (may_sleep) { ++ msleep(ms); ++ } else { ++ while (ms--) ++ udelay(1000); ++ } ++} ++ ++/** ++ * pr_flush() - Wait for printing threads to catch up. ++ * ++ * @timeout_ms: The maximum time (in ms) to wait. ++ * @reset_on_progress: Reset the timeout if forward progress is seen. ++ * ++ * A value of 0 for @timeout_ms means no waiting will occur. A value of -1 ++ * represents infinite waiting. ++ * ++ * If @reset_on_progress is true, the timeout will be reset whenever any ++ * printer has been seen to make some forward progress. ++ * ++ * Context: Any context. ++ * Return: true if all enabled printers are caught up. ++ */ ++bool pr_flush(int timeout_ms, bool reset_on_progress) ++{ ++ int remaining = timeout_ms; ++ struct console *con; ++ u64 last_diff = 0; ++ bool may_sleep; ++ u64 printk_seq; ++ u64 diff; ++ u64 seq; ++ ++ may_sleep = (preemptible() && ++ !in_softirq() && ++ system_state >= SYSTEM_RUNNING); ++ ++ seq = prb_next_seq(prb); ++ ++ for (;;) { ++ diff = 0; ++ ++ for_each_console(con) { ++ if (!(con->flags & CON_ENABLED)) ++ continue; ++ printk_seq = atomic64_read(&con->printk_seq); ++ if (printk_seq < seq) ++ diff += seq - printk_seq; ++ } ++ ++ if (diff != last_diff && reset_on_progress) ++ remaining = timeout_ms; ++ ++ if (!diff || remaining == 0) ++ break; ++ ++ if (remaining < 0) { ++ pr_msleep(may_sleep, 100); ++ } else if (remaining < 100) { ++ pr_msleep(may_sleep, remaining); ++ remaining = 0; ++ } else { ++ pr_msleep(may_sleep, 100); ++ remaining -= 100; ++ } ++ ++ last_diff = diff; ++ } ++ ++ return (diff == 0); ++} ++EXPORT_SYMBOL(pr_flush); +diff --git a/kernel/printk/printk_safe.c b/kernel/printk/printk_safe.c +index b774685cc..218e42566 100644 +--- a/kernel/printk/printk_safe.c ++++ b/kernel/printk/printk_safe.c +@@ -15,295 +15,9 @@ + + #include "internal.h" + +-/* +- * printk() could not take logbuf_lock in NMI context. Instead, +- * it uses an alternative implementation that temporary stores +- * the strings into a per-CPU buffer. The content of the buffer +- * is later flushed into the main ring buffer via IRQ work. +- * +- * The alternative implementation is chosen transparently +- * by examining current printk() context mask stored in @printk_context +- * per-CPU variable. +- * +- * The implementation allows to flush the strings also from another CPU. +- * There are situations when we want to make sure that all buffers +- * were handled or when IRQs are blocked. +- */ +- +-#define SAFE_LOG_BUF_LEN ((1 << CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT) - \ +- sizeof(atomic_t) - \ +- sizeof(atomic_t) - \ +- sizeof(struct irq_work)) +- +-struct printk_safe_seq_buf { +- atomic_t len; /* length of written data */ +- atomic_t message_lost; +- struct irq_work work; /* IRQ work that flushes the buffer */ +- unsigned char buffer[SAFE_LOG_BUF_LEN]; +-}; +- +-static DEFINE_PER_CPU(struct printk_safe_seq_buf, safe_print_seq); + static DEFINE_PER_CPU(int, printk_context); + +-static DEFINE_RAW_SPINLOCK(safe_read_lock); +- + #ifdef CONFIG_PRINTK_NMI +-static DEFINE_PER_CPU(struct printk_safe_seq_buf, nmi_print_seq); +-#endif +- +-/* Get flushed in a more safe context. */ +-static void queue_flush_work(struct printk_safe_seq_buf *s) +-{ +- if (printk_percpu_data_ready()) +- irq_work_queue(&s->work); +-} +- +-/* +- * Add a message to per-CPU context-dependent buffer. NMI and printk-safe +- * have dedicated buffers, because otherwise printk-safe preempted by +- * NMI-printk would have overwritten the NMI messages. +- * +- * The messages are flushed from irq work (or from panic()), possibly, +- * from other CPU, concurrently with printk_safe_log_store(). Should this +- * happen, printk_safe_log_store() will notice the buffer->len mismatch +- * and repeat the write. +- */ +-static __printf(2, 0) int printk_safe_log_store(struct printk_safe_seq_buf *s, +- const char *fmt, va_list args) +-{ +- int add; +- size_t len; +- va_list ap; +- +-again: +- len = atomic_read(&s->len); +- +- /* The trailing '\0' is not counted into len. */ +- if (len >= sizeof(s->buffer) - 1) { +- atomic_inc(&s->message_lost); +- queue_flush_work(s); +- return 0; +- } +- +- /* +- * Make sure that all old data have been read before the buffer +- * was reset. This is not needed when we just append data. +- */ +- if (!len) +- smp_rmb(); +- +- va_copy(ap, args); +- add = vscnprintf(s->buffer + len, sizeof(s->buffer) - len, fmt, ap); +- va_end(ap); +- if (!add) +- return 0; +- +- /* +- * Do it once again if the buffer has been flushed in the meantime. +- * Note that atomic_cmpxchg() is an implicit memory barrier that +- * makes sure that the data were written before updating s->len. +- */ +- if (atomic_cmpxchg(&s->len, len, len + add) != len) +- goto again; +- +- queue_flush_work(s); +- return add; +-} +- +-static inline void printk_safe_flush_line(const char *text, int len) +-{ +- /* +- * Avoid any console drivers calls from here, because we may be +- * in NMI or printk_safe context (when in panic). The messages +- * must go only into the ring buffer at this stage. Consoles will +- * get explicitly called later when a crashdump is not generated. +- */ +- printk_deferred("%.*s", len, text); +-} +- +-/* printk part of the temporary buffer line by line */ +-static int printk_safe_flush_buffer(const char *start, size_t len) +-{ +- const char *c, *end; +- bool header; +- +- c = start; +- end = start + len; +- header = true; +- +- /* Print line by line. */ +- while (c < end) { +- if (*c == '\n') { +- printk_safe_flush_line(start, c - start + 1); +- start = ++c; +- header = true; +- continue; +- } +- +- /* Handle continuous lines or missing new line. */ +- if ((c + 1 < end) && printk_get_level(c)) { +- if (header) { +- c = printk_skip_level(c); +- continue; +- } +- +- printk_safe_flush_line(start, c - start); +- start = c++; +- header = true; +- continue; +- } +- +- header = false; +- c++; +- } +- +- /* Check if there was a partial line. Ignore pure header. */ +- if (start < end && !header) { +- static const char newline[] = KERN_CONT "\n"; +- +- printk_safe_flush_line(start, end - start); +- printk_safe_flush_line(newline, strlen(newline)); +- } +- +- return len; +-} +- +-static void report_message_lost(struct printk_safe_seq_buf *s) +-{ +- int lost = atomic_xchg(&s->message_lost, 0); +- +- if (lost) +- printk_deferred("Lost %d message(s)!\n", lost); +-} +- +-/* +- * Flush data from the associated per-CPU buffer. The function +- * can be called either via IRQ work or independently. +- */ +-static void __printk_safe_flush(struct irq_work *work) +-{ +- struct printk_safe_seq_buf *s = +- container_of(work, struct printk_safe_seq_buf, work); +- unsigned long flags; +- size_t len; +- int i; +- +- /* +- * The lock has two functions. First, one reader has to flush all +- * available message to make the lockless synchronization with +- * writers easier. Second, we do not want to mix messages from +- * different CPUs. This is especially important when printing +- * a backtrace. +- */ +- raw_spin_lock_irqsave(&safe_read_lock, flags); +- +- i = 0; +-more: +- len = atomic_read(&s->len); +- +- /* +- * This is just a paranoid check that nobody has manipulated +- * the buffer an unexpected way. If we printed something then +- * @len must only increase. Also it should never overflow the +- * buffer size. +- */ +- if ((i && i >= len) || len > sizeof(s->buffer)) { +- const char *msg = "printk_safe_flush: internal error\n"; +- +- printk_safe_flush_line(msg, strlen(msg)); +- len = 0; +- } +- +- if (!len) +- goto out; /* Someone else has already flushed the buffer. */ +- +- /* Make sure that data has been written up to the @len */ +- smp_rmb(); +- i += printk_safe_flush_buffer(s->buffer + i, len - i); +- +- /* +- * Check that nothing has got added in the meantime and truncate +- * the buffer. Note that atomic_cmpxchg() is an implicit memory +- * barrier that makes sure that the data were copied before +- * updating s->len. +- */ +- if (atomic_cmpxchg(&s->len, len, 0) != len) +- goto more; +- +-out: +- report_message_lost(s); +- raw_spin_unlock_irqrestore(&safe_read_lock, flags); +-} +- +-/** +- * printk_safe_flush - flush all per-cpu nmi buffers. +- * +- * The buffers are flushed automatically via IRQ work. This function +- * is useful only when someone wants to be sure that all buffers have +- * been flushed at some point. +- */ +-void printk_safe_flush(void) +-{ +- int cpu; +- +- for_each_possible_cpu(cpu) { +-#ifdef CONFIG_PRINTK_NMI +- __printk_safe_flush(&per_cpu(nmi_print_seq, cpu).work); +-#endif +- __printk_safe_flush(&per_cpu(safe_print_seq, cpu).work); +- } +-} +- +-/** +- * printk_safe_flush_on_panic - flush all per-cpu nmi buffers when the system +- * goes down. +- * +- * Similar to printk_safe_flush() but it can be called even in NMI context when +- * the system goes down. It does the best effort to get NMI messages into +- * the main ring buffer. +- * +- * Note that it could try harder when there is only one CPU online. +- */ +-void printk_safe_flush_on_panic(void) +-{ +- /* +- * Make sure that we could access the main ring buffer. +- * Do not risk a double release when more CPUs are up. +- */ +- if (raw_spin_is_locked(&logbuf_lock)) { +- if (num_online_cpus() > 1) +- return; +- +- debug_locks_off(); +- raw_spin_lock_init(&logbuf_lock); +- } +- +- if (raw_spin_is_locked(&safe_read_lock)) { +- if (num_online_cpus() > 1) +- return; +- +- debug_locks_off(); +- raw_spin_lock_init(&safe_read_lock); +- } +- +- printk_safe_flush(); +-} +-EXPORT_SYMBOL_GPL(printk_safe_flush_on_panic); +- +-#ifdef CONFIG_PRINTK_NMI +-/* +- * Safe printk() for NMI context. It uses a per-CPU buffer to +- * store the message. NMIs are not nested, so there is always only +- * one writer running. But the buffer might get flushed from another +- * CPU, so we need to be careful. +- */ +-static __printf(1, 0) int vprintk_nmi(const char *fmt, va_list args) +-{ +- struct printk_safe_seq_buf *s = this_cpu_ptr(&nmi_print_seq); +- +- return printk_safe_log_store(s, fmt, args); +-} +- + void noinstr printk_nmi_enter(void) + { + this_cpu_add(printk_context, PRINTK_NMI_CONTEXT_OFFSET); +@@ -318,11 +32,6 @@ void noinstr printk_nmi_exit(void) + * Marks a code that might produce many messages in NMI context + * and the risk of losing them is more critical than eventual + * reordering. +- * +- * It has effect only when called in NMI context. Then printk() +- * will try to store the messages into the main logbuf directly +- * and use the per-CPU buffers only as a fallback when the lock +- * is not available. + */ + void printk_nmi_direct_enter(void) + { +@@ -335,27 +44,8 @@ void printk_nmi_direct_exit(void) + this_cpu_and(printk_context, ~PRINTK_NMI_DIRECT_CONTEXT_MASK); + } + +-#else +- +-static __printf(1, 0) int vprintk_nmi(const char *fmt, va_list args) +-{ +- return 0; +-} +- + #endif /* CONFIG_PRINTK_NMI */ + +-/* +- * Lock-less printk(), to avoid deadlocks should the printk() recurse +- * into itself. It uses a per-CPU buffer to store the message, just like +- * NMI. +- */ +-static __printf(1, 0) int vprintk_safe(const char *fmt, va_list args) +-{ +- struct printk_safe_seq_buf *s = this_cpu_ptr(&safe_print_seq); +- +- return printk_safe_log_store(s, fmt, args); +-} +- + /* Can be preempted by NMI. */ + void printk_safe_enter(void) + { +@@ -379,47 +69,22 @@ __printf(1, 0) int vprintk_func(const char *fmt, va_list args) + #endif + + /* +- * Try to use the main logbuf even in NMI. But avoid calling console ++ * Use the main logbuf even in NMI. But avoid calling console + * drivers that might have their own locks. + */ +- if ((this_cpu_read(printk_context) & PRINTK_NMI_DIRECT_CONTEXT_MASK) && +- raw_spin_trylock(&logbuf_lock)) { ++ if (this_cpu_read(printk_context) & ++ (PRINTK_NMI_DIRECT_CONTEXT_MASK | ++ PRINTK_NMI_CONTEXT_MASK | ++ PRINTK_SAFE_CONTEXT_MASK)) { + int len; + ++ printk_safe_enter_irqsave(flags); + len = vprintk_store(0, LOGLEVEL_DEFAULT, NULL, fmt, args); +- raw_spin_unlock(&logbuf_lock); ++ printk_safe_exit_irqrestore(flags); + defer_console_output(); + return len; + } + +- /* Use extra buffer in NMI when logbuf_lock is taken or in safe mode. */ +- if (this_cpu_read(printk_context) & PRINTK_NMI_CONTEXT_MASK) +- return vprintk_nmi(fmt, args); +- +- /* Use extra buffer to prevent a recursion deadlock in safe mode. */ +- if (this_cpu_read(printk_context) & PRINTK_SAFE_CONTEXT_MASK) +- return vprintk_safe(fmt, args); +- + /* No obstacles. */ + return vprintk_default(fmt, args); + } +- +-void __init printk_safe_init(void) +-{ +- int cpu; +- +- for_each_possible_cpu(cpu) { +- struct printk_safe_seq_buf *s; +- +- s = &per_cpu(safe_print_seq, cpu); +- init_irq_work(&s->work, __printk_safe_flush); +- +-#ifdef CONFIG_PRINTK_NMI +- s = &per_cpu(nmi_print_seq, cpu); +- init_irq_work(&s->work, __printk_safe_flush); +-#endif +- } +- +- /* Flush pending messages that did not have scheduled IRQ works. */ +- printk_safe_flush(); +-} +diff --git a/kernel/ptrace.c b/kernel/ptrace.c +index e3210358b..3b531adf1 100644 +--- a/kernel/ptrace.c ++++ b/kernel/ptrace.c +@@ -197,7 +197,14 @@ static bool ptrace_freeze_traced(struct task_struct *task) + spin_lock_irq(&task->sighand->siglock); + if (task_is_traced(task) && !looks_like_a_spurious_pid(task) && + !__fatal_signal_pending(task)) { +- task->state = __TASK_TRACED; ++ unsigned long flags; ++ ++ raw_spin_lock_irqsave(&task->pi_lock, flags); ++ if (task->state & __TASK_TRACED) ++ task->state = __TASK_TRACED; ++ else ++ task->saved_state = __TASK_TRACED; ++ raw_spin_unlock_irqrestore(&task->pi_lock, flags); + ret = true; + } + spin_unlock_irq(&task->sighand->siglock); +@@ -207,8 +214,8 @@ static bool ptrace_freeze_traced(struct task_struct *task) + + static void ptrace_unfreeze_traced(struct task_struct *task) + { +- if (task->state != __TASK_TRACED) +- return; ++ unsigned long flags; ++ bool frozen = true; + + WARN_ON(!task->ptrace || task->parent != current); + +@@ -217,12 +224,19 @@ static void ptrace_unfreeze_traced(struct task_struct *task) + * Recheck state under the lock to close this race. + */ + spin_lock_irq(&task->sighand->siglock); +- if (task->state == __TASK_TRACED) { +- if (__fatal_signal_pending(task)) +- wake_up_state(task, __TASK_TRACED); +- else +- task->state = TASK_TRACED; +- } ++ ++ raw_spin_lock_irqsave(&task->pi_lock, flags); ++ if (task->state == __TASK_TRACED) ++ task->state = TASK_TRACED; ++ else if (task->saved_state == __TASK_TRACED) ++ task->saved_state = TASK_TRACED; ++ else ++ frozen = false; ++ raw_spin_unlock_irqrestore(&task->pi_lock, flags); ++ ++ if (frozen && __fatal_signal_pending(task)) ++ wake_up_state(task, __TASK_TRACED); ++ + spin_unlock_irq(&task->sighand->siglock); + } + +diff --git a/kernel/rcu/Kconfig b/kernel/rcu/Kconfig +index 84dfa8dae..e222aa0a5 100644 +--- a/kernel/rcu/Kconfig ++++ b/kernel/rcu/Kconfig +@@ -189,8 +189,8 @@ config RCU_FAST_NO_HZ + + config RCU_BOOST + bool "Enable RCU priority boosting" +- depends on RT_MUTEXES && PREEMPT_RCU && RCU_EXPERT +- default n ++ depends on (RT_MUTEXES && PREEMPT_RCU && RCU_EXPERT) || PREEMPT_RT ++ default y if PREEMPT_RT + help + This option boosts the priority of preempted RCU readers that + block the current preemptible RCU grace period for too long. +diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c +index b9c45b2d7..b0e409c65 100644 +--- a/kernel/rcu/tree.c ++++ b/kernel/rcu/tree.c +@@ -100,8 +100,10 @@ static struct rcu_state rcu_state = { + static bool dump_tree; + module_param(dump_tree, bool, 0444); + /* By default, use RCU_SOFTIRQ instead of rcuc kthreads. */ +-static bool use_softirq = true; ++static bool use_softirq = !IS_ENABLED(CONFIG_PREEMPT_RT); ++#ifndef CONFIG_PREEMPT_RT + module_param(use_softirq, bool, 0444); ++#endif + /* Control rcu_node-tree auto-balancing at boot time. */ + static bool rcu_fanout_exact; + module_param(rcu_fanout_exact, bool, 0444); +diff --git a/kernel/rcu/update.c b/kernel/rcu/update.c +index 849f0aa99..dd94a602a 100644 +--- a/kernel/rcu/update.c ++++ b/kernel/rcu/update.c +@@ -56,8 +56,10 @@ + #ifndef CONFIG_TINY_RCU + module_param(rcu_expedited, int, 0); + module_param(rcu_normal, int, 0); +-static int rcu_normal_after_boot; ++static int rcu_normal_after_boot = IS_ENABLED(CONFIG_PREEMPT_RT); ++#ifndef CONFIG_PREEMPT_RT + module_param(rcu_normal_after_boot, int, 0); ++#endif + #endif /* #ifndef CONFIG_TINY_RCU */ + + #ifdef CONFIG_DEBUG_LOCK_ALLOC +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 56be8d1c7..abb16a861 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -64,7 +64,11 @@ const_debug unsigned int sysctl_sched_features = + * Number of tasks to iterate in a single balance run. + * Limited because this is done with IRQs disabled. + */ ++#ifdef CONFIG_PREEMPT_RT ++const_debug unsigned int sysctl_sched_nr_migrate = 8; ++#else + const_debug unsigned int sysctl_sched_nr_migrate = 32; ++#endif + + /* + * period over which we measure -rt task CPU usage in us. +@@ -502,9 +506,15 @@ static bool set_nr_if_polling(struct task_struct *p) + #endif + #endif + +-static bool __wake_q_add(struct wake_q_head *head, struct task_struct *task) ++static bool __wake_q_add(struct wake_q_head *head, struct task_struct *task, ++ bool sleeper) + { +- struct wake_q_node *node = &task->wake_q; ++ struct wake_q_node *node; ++ ++ if (sleeper) ++ node = &task->wake_q_sleeper; ++ else ++ node = &task->wake_q; + + /* + * Atomically grab the task, if ->wake_q is !nil already it means +@@ -540,7 +550,13 @@ static bool __wake_q_add(struct wake_q_head *head, struct task_struct *task) + */ + void wake_q_add(struct wake_q_head *head, struct task_struct *task) + { +- if (__wake_q_add(head, task)) ++ if (__wake_q_add(head, task, false)) ++ get_task_struct(task); ++} ++ ++void wake_q_add_sleeper(struct wake_q_head *head, struct task_struct *task) ++{ ++ if (__wake_q_add(head, task, true)) + get_task_struct(task); + } + +@@ -563,28 +579,39 @@ void wake_q_add(struct wake_q_head *head, struct task_struct *task) + */ + void wake_q_add_safe(struct wake_q_head *head, struct task_struct *task) + { +- if (!__wake_q_add(head, task)) ++ if (!__wake_q_add(head, task, false)) + put_task_struct(task); + } + +-void wake_up_q(struct wake_q_head *head) ++void __wake_up_q(struct wake_q_head *head, bool sleeper) + { + struct wake_q_node *node = head->first; + + while (node != WAKE_Q_TAIL) { + struct task_struct *task; + +- task = container_of(node, struct task_struct, wake_q); ++ if (sleeper) ++ task = container_of(node, struct task_struct, wake_q_sleeper); ++ else ++ task = container_of(node, struct task_struct, wake_q); ++ + BUG_ON(!task); + /* Task can safely be re-inserted now: */ + node = node->next; +- task->wake_q.next = NULL; + ++ if (sleeper) ++ task->wake_q_sleeper.next = NULL; ++ else ++ task->wake_q.next = NULL; + /* + * wake_up_process() executes a full barrier, which pairs with + * the queueing in wake_q_add() so as not to miss wakeups. + */ +- wake_up_process(task); ++ if (sleeper) ++ wake_up_lock_sleeper(task); ++ else ++ wake_up_process(task); ++ + put_task_struct(task); + } + } +@@ -620,6 +647,48 @@ void resched_curr(struct rq *rq) + trace_sched_wake_idle_without_ipi(cpu); + } + ++#ifdef CONFIG_PREEMPT_LAZY ++ ++static int tsk_is_polling(struct task_struct *p) ++{ ++#ifdef TIF_POLLING_NRFLAG ++ return test_tsk_thread_flag(p, TIF_POLLING_NRFLAG); ++#else ++ return 0; ++#endif ++} ++ ++void resched_curr_lazy(struct rq *rq) ++{ ++ struct task_struct *curr = rq->curr; ++ int cpu; ++ ++ if (!sched_feat(PREEMPT_LAZY)) { ++ resched_curr(rq); ++ return; ++ } ++ ++ lockdep_assert_held(&rq->lock); ++ ++ if (test_tsk_need_resched(curr)) ++ return; ++ ++ if (test_tsk_need_resched_lazy(curr)) ++ return; ++ ++ set_tsk_need_resched_lazy(curr); ++ ++ cpu = cpu_of(rq); ++ if (cpu == smp_processor_id()) ++ return; ++ ++ /* NEED_RESCHED_LAZY must be visible before we test polling */ ++ smp_mb(); ++ if (!tsk_is_polling(curr)) ++ smp_send_reschedule(cpu); ++} ++#endif ++ + void resched_cpu(int cpu) + { + struct rq *rq = cpu_rq(cpu); +@@ -1702,6 +1771,82 @@ void check_preempt_curr(struct rq *rq, struct task_struct *p, int flags) + + #ifdef CONFIG_SMP + ++static void ++__do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask, u32 flags); ++ ++static int __set_cpus_allowed_ptr(struct task_struct *p, ++ const struct cpumask *new_mask, ++ u32 flags); ++ ++static void migrate_disable_switch(struct rq *rq, struct task_struct *p) ++{ ++ if (likely(!p->migration_disabled)) ++ return; ++ ++ if (p->cpus_ptr != &p->cpus_mask) ++ return; ++ ++ /* ++ * Violates locking rules! see comment in __do_set_cpus_allowed(). ++ */ ++ __do_set_cpus_allowed(p, cpumask_of(rq->cpu), SCA_MIGRATE_DISABLE); ++} ++ ++void migrate_disable(void) ++{ ++ struct task_struct *p = current; ++ ++ if (p->migration_disabled) { ++ p->migration_disabled++; ++ return; ++ } ++ ++ trace_sched_migrate_disable_tp(p); ++ ++ preempt_disable(); ++ this_rq()->nr_pinned++; ++ p->migration_disabled = 1; ++ preempt_lazy_disable(); ++ preempt_enable(); ++} ++EXPORT_SYMBOL_GPL(migrate_disable); ++ ++void migrate_enable(void) ++{ ++ struct task_struct *p = current; ++ ++ if (p->migration_disabled > 1) { ++ p->migration_disabled--; ++ return; ++ } ++ ++ /* ++ * Ensure stop_task runs either before or after this, and that ++ * __set_cpus_allowed_ptr(SCA_MIGRATE_ENABLE) doesn't schedule(). ++ */ ++ preempt_disable(); ++ if (p->cpus_ptr != &p->cpus_mask) ++ __set_cpus_allowed_ptr(p, &p->cpus_mask, SCA_MIGRATE_ENABLE); ++ /* ++ * Mustn't clear migration_disabled() until cpus_ptr points back at the ++ * regular cpus_mask, otherwise things that race (eg. ++ * select_fallback_rq) get confused. ++ */ ++ barrier(); ++ p->migration_disabled = 0; ++ this_rq()->nr_pinned--; ++ preempt_lazy_enable(); ++ preempt_enable(); ++ ++ trace_sched_migrate_enable_tp(p); ++} ++EXPORT_SYMBOL_GPL(migrate_enable); ++ ++static inline bool rq_has_pinned_tasks(struct rq *rq) ++{ ++ return rq->nr_pinned; ++} ++ + /* + * Per-CPU kthreads are allowed to run on !active && online CPUs, see + * __set_cpus_allowed_ptr() and select_fallback_rq(). +@@ -1711,7 +1856,7 @@ static inline bool is_cpu_allowed(struct task_struct *p, int cpu) + if (!cpumask_test_cpu(cpu, p->cpus_ptr)) + return false; + +- if (is_per_cpu_kthread(p)) ++ if (is_per_cpu_kthread(p) || is_migration_disabled(p)) + return cpu_online(cpu); + + return cpu_active(cpu); +@@ -1756,8 +1901,21 @@ static struct rq *move_queued_task(struct rq *rq, struct rq_flags *rf, + } + + struct migration_arg { +- struct task_struct *task; +- int dest_cpu; ++ struct task_struct *task; ++ int dest_cpu; ++ struct set_affinity_pending *pending; ++}; ++ ++/* ++ * @refs: number of wait_for_completion() ++ * @stop_pending: is @stop_work in use ++ */ ++struct set_affinity_pending { ++ refcount_t refs; ++ unsigned int stop_pending; ++ struct completion done; ++ struct cpu_stop_work stop_work; ++ struct migration_arg arg; + }; + + /* +@@ -1790,15 +1948,17 @@ static struct rq *__migrate_task(struct rq *rq, struct rq_flags *rf, + static int migration_cpu_stop(void *data) + { + struct migration_arg *arg = data; ++ struct set_affinity_pending *pending = arg->pending; + struct task_struct *p = arg->task; + struct rq *rq = this_rq(); ++ bool complete = false; + struct rq_flags rf; + + /* + * The original target CPU might have gone down and we might + * be on another CPU but it doesn't matter. + */ +- local_irq_disable(); ++ local_irq_save(rf.flags); + /* + * We need to explicitly wake pending tasks before running + * __migrate_task() such that we will not miss enforcing cpus_ptr +@@ -1808,21 +1968,121 @@ static int migration_cpu_stop(void *data) + + raw_spin_lock(&p->pi_lock); + rq_lock(rq, &rf); ++ + /* + * If task_rq(p) != rq, it cannot be migrated here, because we're + * holding rq->lock, if p->on_rq == 0 it cannot get enqueued because + * we're holding p->pi_lock. + */ + if (task_rq(p) == rq) { ++ if (is_migration_disabled(p)) ++ goto out; ++ ++ if (pending) { ++ if (p->migration_pending == pending) ++ p->migration_pending = NULL; ++ complete = true; ++ ++ if (cpumask_test_cpu(task_cpu(p), &p->cpus_mask)) ++ goto out; ++ } ++ + if (task_on_rq_queued(p)) + rq = __migrate_task(rq, &rf, p, arg->dest_cpu); + else + p->wake_cpu = arg->dest_cpu; ++ ++ /* ++ * XXX __migrate_task() can fail, at which point we might end ++ * up running on a dodgy CPU, AFAICT this can only happen ++ * during CPU hotplug, at which point we'll get pushed out ++ * anyway, so it's probably not a big deal. ++ */ ++ ++ } else if (pending) { ++ /* ++ * This happens when we get migrated between migrate_enable()'s ++ * preempt_enable() and scheduling the stopper task. At that ++ * point we're a regular task again and not current anymore. ++ * ++ * A !PREEMPT kernel has a giant hole here, which makes it far ++ * more likely. ++ */ ++ ++ /* ++ * The task moved before the stopper got to run. We're holding ++ * ->pi_lock, so the allowed mask is stable - if it got ++ * somewhere allowed, we're done. ++ */ ++ if (cpumask_test_cpu(task_cpu(p), p->cpus_ptr)) { ++ if (p->migration_pending == pending) ++ p->migration_pending = NULL; ++ complete = true; ++ goto out; ++ } ++ ++ /* ++ * When migrate_enable() hits a rq mis-match we can't reliably ++ * determine is_migration_disabled() and so have to chase after ++ * it. ++ */ ++ WARN_ON_ONCE(!pending->stop_pending); ++ task_rq_unlock(rq, p, &rf); ++ stop_one_cpu_nowait(task_cpu(p), migration_cpu_stop, ++ &pending->arg, &pending->stop_work); ++ return 0; + } +- rq_unlock(rq, &rf); +- raw_spin_unlock(&p->pi_lock); ++out: ++ if (pending) ++ pending->stop_pending = false; ++ task_rq_unlock(rq, p, &rf); ++ ++ if (complete) ++ complete_all(&pending->done); + +- local_irq_enable(); ++ return 0; ++} ++ ++int push_cpu_stop(void *arg) ++{ ++ struct rq *lowest_rq = NULL, *rq = this_rq(); ++ struct task_struct *p = arg; ++ ++ raw_spin_lock_irq(&p->pi_lock); ++ raw_spin_lock(&rq->lock); ++ ++ if (task_rq(p) != rq) ++ goto out_unlock; ++ ++ if (is_migration_disabled(p)) { ++ p->migration_flags |= MDF_PUSH; ++ goto out_unlock; ++ } ++ ++ p->migration_flags &= ~MDF_PUSH; ++ ++ if (p->sched_class->find_lock_rq) ++ lowest_rq = p->sched_class->find_lock_rq(p, rq); ++ ++ if (!lowest_rq) ++ goto out_unlock; ++ ++ // XXX validate p is still the highest prio task ++ if (task_rq(p) == rq) { ++ deactivate_task(rq, p, 0); ++ set_task_cpu(p, lowest_rq->cpu); ++ activate_task(lowest_rq, p, 0); ++ resched_curr(lowest_rq); ++ } ++ ++ double_unlock_balance(rq, lowest_rq); ++ ++out_unlock: ++ rq->push_busy = false; ++ raw_spin_unlock(&rq->lock); ++ raw_spin_unlock_irq(&p->pi_lock); ++ ++ put_task_struct(p); + return 0; + } + +@@ -1830,18 +2090,39 @@ static int migration_cpu_stop(void *data) + * sched_class::set_cpus_allowed must do the below, but is not required to + * actually call this function. + */ +-void set_cpus_allowed_common(struct task_struct *p, const struct cpumask *new_mask) ++void set_cpus_allowed_common(struct task_struct *p, const struct cpumask *new_mask, u32 flags) + { ++ if (flags & (SCA_MIGRATE_ENABLE | SCA_MIGRATE_DISABLE)) { ++ p->cpus_ptr = new_mask; ++ return; ++ } ++ + cpumask_copy(&p->cpus_mask, new_mask); + p->nr_cpus_allowed = cpumask_weight(new_mask); + } + +-void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) ++static void ++__do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask, u32 flags) + { + struct rq *rq = task_rq(p); + bool queued, running; + +- lockdep_assert_held(&p->pi_lock); ++ /* ++ * This here violates the locking rules for affinity, since we're only ++ * supposed to change these variables while holding both rq->lock and ++ * p->pi_lock. ++ * ++ * HOWEVER, it magically works, because ttwu() is the only code that ++ * accesses these variables under p->pi_lock and only does so after ++ * smp_cond_load_acquire(&p->on_cpu, !VAL), and we're in __schedule() ++ * before finish_task(). ++ * ++ * XXX do further audits, this smells like something putrid. ++ */ ++ if (flags & SCA_MIGRATE_DISABLE) ++ SCHED_WARN_ON(!p->on_cpu); ++ else ++ lockdep_assert_held(&p->pi_lock); + + queued = task_on_rq_queued(p); + running = task_current(rq, p); +@@ -1857,7 +2138,7 @@ void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) + if (running) + put_prev_task(rq, p); + +- p->sched_class->set_cpus_allowed(p, new_mask); ++ p->sched_class->set_cpus_allowed(p, new_mask, flags); + + if (queued) + enqueue_task(rq, p, ENQUEUE_RESTORE | ENQUEUE_NOCLOCK); +@@ -1865,6 +2146,222 @@ void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) + set_next_task(rq, p); + } + ++void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) ++{ ++ __do_set_cpus_allowed(p, new_mask, 0); ++} ++ ++/* ++ * This function is wildly self concurrent; here be dragons. ++ * ++ * ++ * When given a valid mask, __set_cpus_allowed_ptr() must block until the ++ * designated task is enqueued on an allowed CPU. If that task is currently ++ * running, we have to kick it out using the CPU stopper. ++ * ++ * Migrate-Disable comes along and tramples all over our nice sandcastle. ++ * Consider: ++ * ++ * Initial conditions: P0->cpus_mask = [0, 1] ++ * ++ * P0@CPU0 P1 ++ * ++ * migrate_disable(); ++ * ++ * set_cpus_allowed_ptr(P0, [1]); ++ * ++ * P1 *cannot* return from this set_cpus_allowed_ptr() call until P0 executes ++ * its outermost migrate_enable() (i.e. it exits its Migrate-Disable region). ++ * This means we need the following scheme: ++ * ++ * P0@CPU0 P1 ++ * ++ * migrate_disable(); ++ * ++ * set_cpus_allowed_ptr(P0, [1]); ++ * ++ * ++ * migrate_enable(); ++ * __set_cpus_allowed_ptr(); ++ * ++ * `--> ++ * ++ * Now the fun stuff: there may be several P1-like tasks, i.e. multiple ++ * concurrent set_cpus_allowed_ptr(P0, [*]) calls. CPU affinity changes of any ++ * task p are serialized by p->pi_lock, which we can leverage: the one that ++ * should come into effect at the end of the Migrate-Disable region is the last ++ * one. This means we only need to track a single cpumask (i.e. p->cpus_mask), ++ * but we still need to properly signal those waiting tasks at the appropriate ++ * moment. ++ * ++ * This is implemented using struct set_affinity_pending. The first ++ * __set_cpus_allowed_ptr() caller within a given Migrate-Disable region will ++ * setup an instance of that struct and install it on the targeted task_struct. ++ * Any and all further callers will reuse that instance. Those then wait for ++ * a completion signaled at the tail of the CPU stopper callback (1), triggered ++ * on the end of the Migrate-Disable region (i.e. outermost migrate_enable()). ++ * ++ * ++ * (1) In the cases covered above. There is one more where the completion is ++ * signaled within affine_move_task() itself: when a subsequent affinity request ++ * cancels the need for an active migration. Consider: ++ * ++ * Initial conditions: P0->cpus_mask = [0, 1] ++ * ++ * P0@CPU0 P1 P2 ++ * ++ * migrate_disable(); ++ * ++ * set_cpus_allowed_ptr(P0, [1]); ++ * ++ * set_cpus_allowed_ptr(P0, [0, 1]); ++ * ++ * ++ * ++ * Note that the above is safe vs a concurrent migrate_enable(), as any ++ * pending affinity completion is preceded an uninstallion of ++ * p->migration_pending done with p->pi_lock held. ++ */ ++static int affine_move_task(struct rq *rq, struct task_struct *p, struct rq_flags *rf, ++ int dest_cpu, unsigned int flags) ++{ ++ struct set_affinity_pending my_pending = { }, *pending = NULL; ++ bool stop_pending, complete = false; ++ ++ /* Can the task run on the task's current CPU? If so, we're done */ ++ if (cpumask_test_cpu(task_cpu(p), &p->cpus_mask)) { ++ struct task_struct *push_task = NULL; ++ ++ if ((flags & SCA_MIGRATE_ENABLE) && ++ (p->migration_flags & MDF_PUSH) && !rq->push_busy) { ++ rq->push_busy = true; ++ push_task = get_task_struct(p); ++ } ++ ++ /* ++ * If there are pending waiters, but no pending stop_work, ++ * then complete now. ++ */ ++ pending = p->migration_pending; ++ if (pending && !pending->stop_pending) { ++ p->migration_pending = NULL; ++ complete = true; ++ } ++ ++ task_rq_unlock(rq, p, rf); ++ ++ if (push_task) { ++ stop_one_cpu_nowait(rq->cpu, push_cpu_stop, ++ p, &rq->push_work); ++ } ++ ++ if (complete) ++ complete_all(&pending->done); ++ ++ return 0; ++ } ++ ++ if (!(flags & SCA_MIGRATE_ENABLE)) { ++ /* serialized by p->pi_lock */ ++ if (!p->migration_pending) { ++ /* Install the request */ ++ refcount_set(&my_pending.refs, 1); ++ init_completion(&my_pending.done); ++ my_pending.arg = (struct migration_arg) { ++ .task = p, ++ .dest_cpu = dest_cpu, ++ .pending = &my_pending, ++ }; ++ ++ p->migration_pending = &my_pending; ++ } else { ++ pending = p->migration_pending; ++ refcount_inc(&pending->refs); ++ /* ++ * Affinity has changed, but we've already installed a ++ * pending. migration_cpu_stop() *must* see this, else ++ * we risk a completion of the pending despite having a ++ * task on a disallowed CPU. ++ * ++ * Serialized by p->pi_lock, so this is safe. ++ */ ++ pending->arg.dest_cpu = dest_cpu; ++ } ++ } ++ pending = p->migration_pending; ++ /* ++ * - !MIGRATE_ENABLE: ++ * we'll have installed a pending if there wasn't one already. ++ * ++ * - MIGRATE_ENABLE: ++ * we're here because the current CPU isn't matching anymore, ++ * the only way that can happen is because of a concurrent ++ * set_cpus_allowed_ptr() call, which should then still be ++ * pending completion. ++ * ++ * Either way, we really should have a @pending here. ++ */ ++ if (WARN_ON_ONCE(!pending)) { ++ task_rq_unlock(rq, p, rf); ++ return -EINVAL; ++ } ++ ++ if (task_running(rq, p) || p->state == TASK_WAKING) { ++ /* ++ * MIGRATE_ENABLE gets here because 'p == current', but for ++ * anything else we cannot do is_migration_disabled(), punt ++ * and have the stopper function handle it all race-free. ++ */ ++ stop_pending = pending->stop_pending; ++ if (!stop_pending) ++ pending->stop_pending = true; ++ ++ if (flags & SCA_MIGRATE_ENABLE) ++ p->migration_flags &= ~MDF_PUSH; ++ ++ task_rq_unlock(rq, p, rf); ++ ++ if (!stop_pending) { ++ stop_one_cpu_nowait(cpu_of(rq), migration_cpu_stop, ++ &pending->arg, &pending->stop_work); ++ } ++ ++ if (flags & SCA_MIGRATE_ENABLE) ++ return 0; ++ } else { ++ ++ if (!is_migration_disabled(p)) { ++ if (task_on_rq_queued(p)) ++ rq = move_queued_task(rq, rf, p, dest_cpu); ++ ++ if (!pending->stop_pending) { ++ p->migration_pending = NULL; ++ complete = true; ++ } ++ } ++ task_rq_unlock(rq, p, rf); ++ ++ if (complete) ++ complete_all(&pending->done); ++ } ++ ++ wait_for_completion(&pending->done); ++ ++ if (refcount_dec_and_test(&pending->refs)) ++ wake_up_var(&pending->refs); /* No UaF, just an address */ ++ ++ /* ++ * Block the original owner of &pending until all subsequent callers ++ * have seen the completion and decremented the refcount ++ */ ++ wait_var_event(&my_pending.refs, !refcount_read(&my_pending.refs)); ++ ++ /* ARGH */ ++ WARN_ON_ONCE(my_pending.stop_pending); ++ ++ return 0; ++} ++ + /* + * Change a given task's CPU affinity. Migrate the thread to a + * proper CPU and schedule it away if the CPU it's executing on +@@ -1875,7 +2372,8 @@ void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) + * call is not atomic; no spinlocks may be held. + */ + static int __set_cpus_allowed_ptr(struct task_struct *p, +- const struct cpumask *new_mask, bool check) ++ const struct cpumask *new_mask, ++ u32 flags) + { + const struct cpumask *cpu_valid_mask = cpu_active_mask; + unsigned int dest_cpu; +@@ -1886,9 +2384,14 @@ static int __set_cpus_allowed_ptr(struct task_struct *p, + rq = task_rq_lock(p, &rf); + update_rq_clock(rq); + +- if (p->flags & PF_KTHREAD) { ++ if (p->flags & PF_KTHREAD || is_migration_disabled(p)) { + /* +- * Kernel threads are allowed on online && !active CPUs ++ * Kernel threads are allowed on online && !active CPUs. ++ * ++ * Specifically, migration_disabled() tasks must not fail the ++ * cpumask_any_and_distribute() pick below, esp. so on ++ * SCA_MIGRATE_ENABLE, otherwise we'll not call ++ * set_cpus_allowed_common() and actually reset p->cpus_ptr. + */ + cpu_valid_mask = cpu_online_mask; + } +@@ -1897,13 +2400,22 @@ static int __set_cpus_allowed_ptr(struct task_struct *p, + * Must re-check here, to close a race against __kthread_bind(), + * sched_setaffinity() is not guaranteed to observe the flag. + */ +- if (check && (p->flags & PF_NO_SETAFFINITY)) { ++ if ((flags & SCA_CHECK) && (p->flags & PF_NO_SETAFFINITY)) { + ret = -EINVAL; + goto out; + } + +- if (cpumask_equal(&p->cpus_mask, new_mask)) +- goto out; ++ if (!(flags & SCA_MIGRATE_ENABLE)) { ++ if (cpumask_equal(&p->cpus_mask, new_mask)) ++ goto out; ++ ++ if (WARN_ON_ONCE(p == current && ++ is_migration_disabled(p) && ++ !cpumask_test_cpu(task_cpu(p), new_mask))) { ++ ret = -EBUSY; ++ goto out; ++ } ++ } + + /* + * Picking a ~random cpu helps in cases where we are changing affinity +@@ -1916,7 +2428,7 @@ static int __set_cpus_allowed_ptr(struct task_struct *p, + goto out; + } + +- do_set_cpus_allowed(p, new_mask); ++ __do_set_cpus_allowed(p, new_mask, flags); + + if (p->flags & PF_KTHREAD) { + /* +@@ -1928,23 +2440,8 @@ static int __set_cpus_allowed_ptr(struct task_struct *p, + p->nr_cpus_allowed != 1); + } + +- /* Can the task run on the task's current CPU? If so, we're done */ +- if (cpumask_test_cpu(task_cpu(p), new_mask)) +- goto out; ++ return affine_move_task(rq, p, &rf, dest_cpu, flags); + +- if (task_running(rq, p) || p->state == TASK_WAKING) { +- struct migration_arg arg = { p, dest_cpu }; +- /* Need help from migration thread: drop lock and wait. */ +- task_rq_unlock(rq, p, &rf); +- stop_one_cpu(cpu_of(rq), migration_cpu_stop, &arg); +- return 0; +- } else if (task_on_rq_queued(p)) { +- /* +- * OK, since we're going to drop the lock immediately +- * afterwards anyway. +- */ +- rq = move_queued_task(rq, &rf, p, dest_cpu); +- } + out: + task_rq_unlock(rq, p, &rf); + +@@ -1953,7 +2450,7 @@ static int __set_cpus_allowed_ptr(struct task_struct *p, + + int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask) + { +- return __set_cpus_allowed_ptr(p, new_mask, false); ++ return __set_cpus_allowed_ptr(p, new_mask, 0); + } + EXPORT_SYMBOL_GPL(set_cpus_allowed_ptr); + +@@ -1994,6 +2491,8 @@ void set_task_cpu(struct task_struct *p, unsigned int new_cpu) + * Clearly, migrating tasks to offline CPUs is a fairly daft thing. + */ + WARN_ON_ONCE(!cpu_online(new_cpu)); ++ ++ WARN_ON_ONCE(is_migration_disabled(p)); + #endif + + trace_sched_migrate_task(p, new_cpu); +@@ -2126,6 +2625,18 @@ int migrate_swap(struct task_struct *cur, struct task_struct *p, + } + #endif /* CONFIG_NUMA_BALANCING */ + ++static bool check_task_state(struct task_struct *p, long match_state) ++{ ++ bool match = false; ++ ++ raw_spin_lock_irq(&p->pi_lock); ++ if (p->state == match_state || p->saved_state == match_state) ++ match = true; ++ raw_spin_unlock_irq(&p->pi_lock); ++ ++ return match; ++} ++ + /* + * wait_task_inactive - wait for a thread to unschedule. + * +@@ -2170,7 +2681,7 @@ unsigned long wait_task_inactive(struct task_struct *p, long match_state) + * is actually now running somewhere else! + */ + while (task_running(rq, p)) { +- if (match_state && unlikely(p->state != match_state)) ++ if (match_state && !check_task_state(p, match_state)) + return 0; + cpu_relax(); + } +@@ -2185,7 +2696,8 @@ unsigned long wait_task_inactive(struct task_struct *p, long match_state) + running = task_running(rq, p); + queued = task_on_rq_queued(p); + ncsw = 0; +- if (!match_state || p->state == match_state) ++ if (!match_state || p->state == match_state || ++ p->saved_state == match_state) + ncsw = p->nvcsw | LONG_MIN; /* sets MSB */ + task_rq_unlock(rq, p, &rf); + +@@ -2219,7 +2731,7 @@ unsigned long wait_task_inactive(struct task_struct *p, long match_state) + ktime_t to = NSEC_PER_SEC / HZ; + + set_current_state(TASK_UNINTERRUPTIBLE); +- schedule_hrtimeout(&to, HRTIMER_MODE_REL); ++ schedule_hrtimeout(&to, HRTIMER_MODE_REL_HARD); + continue; + } + +@@ -2324,6 +2836,12 @@ static int select_fallback_rq(int cpu, struct task_struct *p) + } + fallthrough; + case possible: ++ /* ++ * XXX When called from select_task_rq() we only ++ * hold p->pi_lock and again violate locking order. ++ * ++ * More yuck to audit. ++ */ + do_set_cpus_allowed(p, cpu_possible_mask); + state = fail; + break; +@@ -2358,7 +2876,7 @@ int select_task_rq(struct task_struct *p, int cpu, int sd_flags, int wake_flags) + { + lockdep_assert_held(&p->pi_lock); + +- if (p->nr_cpus_allowed > 1) ++ if (p->nr_cpus_allowed > 1 && !is_migration_disabled(p)) + cpu = p->sched_class->select_task_rq(p, cpu, sd_flags, wake_flags); + else + cpu = cpumask_any(p->cpus_ptr); +@@ -2381,6 +2899,7 @@ int select_task_rq(struct task_struct *p, int cpu, int sd_flags, int wake_flags) + + void sched_set_stop_task(int cpu, struct task_struct *stop) + { ++ static struct lock_class_key stop_pi_lock; + struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 }; + struct task_struct *old_stop = cpu_rq(cpu)->stop; + +@@ -2396,6 +2915,20 @@ void sched_set_stop_task(int cpu, struct task_struct *stop) + sched_setscheduler_nocheck(stop, SCHED_FIFO, ¶m); + + stop->sched_class = &stop_sched_class; ++ ++ /* ++ * The PI code calls rt_mutex_setprio() with ->pi_lock held to ++ * adjust the effective priority of a task. As a result, ++ * rt_mutex_setprio() can trigger (RT) balancing operations, ++ * which can then trigger wakeups of the stop thread to push ++ * around the current task. ++ * ++ * The stop task itself will never be part of the PI-chain, it ++ * never blocks, therefore that ->pi_lock recursion is safe. ++ * Tell lockdep about this by placing the stop->pi_lock in its ++ * own class. ++ */ ++ lockdep_set_class(&stop->pi_lock, &stop_pi_lock); + } + + cpu_rq(cpu)->stop = stop; +@@ -2409,15 +2942,23 @@ void sched_set_stop_task(int cpu, struct task_struct *stop) + } + } + +-#else ++#else /* CONFIG_SMP */ + + static inline int __set_cpus_allowed_ptr(struct task_struct *p, +- const struct cpumask *new_mask, bool check) ++ const struct cpumask *new_mask, ++ u32 flags) + { + return set_cpus_allowed_ptr(p, new_mask); + } + +-#endif /* CONFIG_SMP */ ++static inline void migrate_disable_switch(struct rq *rq, struct task_struct *p) { } ++ ++static inline bool rq_has_pinned_tasks(struct rq *rq) ++{ ++ return false; ++} ++ ++#endif /* !CONFIG_SMP */ + + static void + ttwu_stat(struct task_struct *p, int cpu, int wake_flags) +@@ -2838,7 +3379,7 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) + int cpu, success = 0; + + preempt_disable(); +- if (p == current) { ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT) && p == current) { + /* + * We're waking current, this means 'p->on_rq' and 'task_cpu(p) + * == smp_processor_id()'. Together this means we can special +@@ -2868,8 +3409,26 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) + */ + raw_spin_lock_irqsave(&p->pi_lock, flags); + smp_mb__after_spinlock(); +- if (!(p->state & state)) ++ if (!(p->state & state)) { ++ /* ++ * The task might be running due to a spinlock sleeper ++ * wakeup. Check the saved state and set it to running ++ * if the wakeup condition is true. ++ */ ++ if (!(wake_flags & WF_LOCK_SLEEPER)) { ++ if (p->saved_state & state) { ++ p->saved_state = TASK_RUNNING; ++ success = 1; ++ } ++ } + goto unlock; ++ } ++ /* ++ * If this is a regular wakeup, then we can unconditionally ++ * clear the saved state of a "lock sleeper". ++ */ ++ if (!(wake_flags & WF_LOCK_SLEEPER)) ++ p->saved_state = TASK_RUNNING; + + trace_sched_waking(p); + +@@ -3058,6 +3617,18 @@ int wake_up_process(struct task_struct *p) + } + EXPORT_SYMBOL(wake_up_process); + ++/** ++ * wake_up_lock_sleeper - Wake up a specific process blocked on a "sleeping lock" ++ * @p: The process to be woken up. ++ * ++ * Same as wake_up_process() above, but wake_flags=WF_LOCK_SLEEPER to indicate ++ * the nature of the wakeup. ++ */ ++int wake_up_lock_sleeper(struct task_struct *p) ++{ ++ return try_to_wake_up(p, TASK_UNINTERRUPTIBLE, WF_LOCK_SLEEPER); ++} ++ + int wake_up_state(struct task_struct *p, unsigned int state) + { + return try_to_wake_up(p, state, 0); +@@ -3111,6 +3682,7 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p) + init_numa_balancing(clone_flags, p); + #ifdef CONFIG_SMP + p->wake_entry.u_flags = CSD_TYPE_TTWU; ++ p->migration_pending = NULL; + #endif + } + +@@ -3316,6 +3888,9 @@ int sched_fork(unsigned long clone_flags, struct task_struct *p) + p->on_cpu = 0; + #endif + init_task_preempt_count(p); ++#ifdef CONFIG_HAVE_PREEMPT_LAZY ++ task_thread_info(p)->preempt_lazy_count = 0; ++#endif + #ifdef CONFIG_SMP + plist_node_init(&p->pushable_tasks, MAX_PRIO); + RB_CLEAR_NODE(&p->pushable_dl_tasks); +@@ -3494,51 +4069,135 @@ fire_sched_out_preempt_notifiers(struct task_struct *curr, + __fire_sched_out_preempt_notifiers(curr, next); + } + +-#else /* !CONFIG_PREEMPT_NOTIFIERS */ ++#else /* !CONFIG_PREEMPT_NOTIFIERS */ ++ ++static inline void fire_sched_in_preempt_notifiers(struct task_struct *curr) ++{ ++} ++ ++static inline void ++fire_sched_out_preempt_notifiers(struct task_struct *curr, ++ struct task_struct *next) ++{ ++} ++ ++#endif /* CONFIG_PREEMPT_NOTIFIERS */ ++ ++static inline void prepare_task(struct task_struct *next) ++{ ++#ifdef CONFIG_SMP ++ /* ++ * Claim the task as running, we do this before switching to it ++ * such that any running task will have this set. ++ * ++ * See the ttwu() WF_ON_CPU case and its ordering comment. ++ */ ++ WRITE_ONCE(next->on_cpu, 1); ++#endif ++} ++ ++static inline void finish_task(struct task_struct *prev) ++{ ++#ifdef CONFIG_SMP ++ /* ++ * This must be the very last reference to @prev from this CPU. After ++ * p->on_cpu is cleared, the task can be moved to a different CPU. We ++ * must ensure this doesn't happen until the switch is completely ++ * finished. ++ * ++ * In particular, the load of prev->state in finish_task_switch() must ++ * happen before this. ++ * ++ * Pairs with the smp_cond_load_acquire() in try_to_wake_up(). ++ */ ++ smp_store_release(&prev->on_cpu, 0); ++#endif ++} ++ ++#ifdef CONFIG_SMP ++ ++static void do_balance_callbacks(struct rq *rq, struct callback_head *head) ++{ ++ void (*func)(struct rq *rq); ++ struct callback_head *next; ++ ++ lockdep_assert_held(&rq->lock); ++ ++ while (head) { ++ func = (void (*)(struct rq *))head->func; ++ next = head->next; ++ head->next = NULL; ++ head = next; ++ ++ func(rq); ++ } ++} ++ ++static inline struct callback_head *splice_balance_callbacks(struct rq *rq) ++{ ++ struct callback_head *head = rq->balance_callback; ++ ++ lockdep_assert_held(&rq->lock); ++ if (head) { ++ rq->balance_callback = NULL; ++ rq->balance_flags &= ~BALANCE_WORK; ++ } ++ ++ return head; ++} ++ ++static void __balance_callbacks(struct rq *rq) ++{ ++ do_balance_callbacks(rq, splice_balance_callbacks(rq)); ++} ++ ++static inline void balance_callbacks(struct rq *rq, struct callback_head *head) ++{ ++ unsigned long flags; ++ ++ if (unlikely(head)) { ++ raw_spin_lock_irqsave(&rq->lock, flags); ++ do_balance_callbacks(rq, head); ++ raw_spin_unlock_irqrestore(&rq->lock, flags); ++ } ++} ++ ++static void balance_push(struct rq *rq); ++ ++static inline void balance_switch(struct rq *rq) ++{ ++ if (likely(!rq->balance_flags)) ++ return; ++ ++ if (rq->balance_flags & BALANCE_PUSH) { ++ balance_push(rq); ++ return; ++ } ++ ++ __balance_callbacks(rq); ++} ++ ++#else + +-static inline void fire_sched_in_preempt_notifiers(struct task_struct *curr) ++static inline void __balance_callbacks(struct rq *rq) + { + } + +-static inline void +-fire_sched_out_preempt_notifiers(struct task_struct *curr, +- struct task_struct *next) ++static inline struct callback_head *splice_balance_callbacks(struct rq *rq) + { ++ return NULL; + } + +-#endif /* CONFIG_PREEMPT_NOTIFIERS */ +- +-static inline void prepare_task(struct task_struct *next) ++static inline void balance_callbacks(struct rq *rq, struct callback_head *head) + { +-#ifdef CONFIG_SMP +- /* +- * Claim the task as running, we do this before switching to it +- * such that any running task will have this set. +- * +- * See the ttwu() WF_ON_CPU case and its ordering comment. +- */ +- WRITE_ONCE(next->on_cpu, 1); +-#endif + } + +-static inline void finish_task(struct task_struct *prev) ++static inline void balance_switch(struct rq *rq) + { +-#ifdef CONFIG_SMP +- /* +- * This must be the very last reference to @prev from this CPU. After +- * p->on_cpu is cleared, the task can be moved to a different CPU. We +- * must ensure this doesn't happen until the switch is completely +- * finished. +- * +- * In particular, the load of prev->state in finish_task_switch() must +- * happen before this. +- * +- * Pairs with the smp_cond_load_acquire() in try_to_wake_up(). +- */ +- smp_store_release(&prev->on_cpu, 0); +-#endif + } + ++#endif ++ + static inline void + prepare_lock_switch(struct rq *rq, struct task_struct *next, struct rq_flags *rf) + { +@@ -3564,6 +4223,7 @@ static inline void finish_lock_switch(struct rq *rq) + * prev into current: + */ + spin_acquire(&rq->lock.dep_map, 0, 0, _THIS_IP_); ++ balance_switch(rq); + raw_spin_unlock_irq(&rq->lock); + } + +@@ -3579,6 +4239,22 @@ static inline void finish_lock_switch(struct rq *rq) + # define finish_arch_post_lock_switch() do { } while (0) + #endif + ++static inline void kmap_local_sched_out(void) ++{ ++#ifdef CONFIG_KMAP_LOCAL ++ if (unlikely(current->kmap_ctrl.idx)) ++ __kmap_local_sched_out(); ++#endif ++} ++ ++static inline void kmap_local_sched_in(void) ++{ ++#ifdef CONFIG_KMAP_LOCAL ++ if (unlikely(current->kmap_ctrl.idx)) ++ __kmap_local_sched_in(); ++#endif ++} ++ + /** + * prepare_task_switch - prepare to switch tasks + * @rq: the runqueue preparing to switch +@@ -3601,6 +4277,7 @@ prepare_task_switch(struct rq *rq, struct task_struct *prev, + perf_event_task_sched_out(prev, next); + rseq_preempt(prev); + fire_sched_out_preempt_notifiers(prev, next); ++ kmap_local_sched_out(); + prepare_task(next); + prepare_arch_switch(next); + } +@@ -3668,6 +4345,7 @@ static struct rq *finish_task_switch(struct task_struct *prev) + finish_lock_switch(rq); + finish_arch_post_lock_switch(); + kcov_finish_switch(current); ++ kmap_local_sched_in(); + + fire_sched_in_preempt_notifiers(current); + /* +@@ -3682,66 +4360,24 @@ static struct rq *finish_task_switch(struct task_struct *prev) + * provided by mmdrop(), + * - a sync_core for SYNC_CORE. + */ ++ /* ++ * We use mmdrop_delayed() here so we don't have to do the ++ * full __mmdrop() when we are the last user. ++ */ + if (mm) { + membarrier_mm_sync_core_before_usermode(mm); +- mmdrop(mm); ++ mmdrop_delayed(mm); + } + if (unlikely(prev_state == TASK_DEAD)) { + if (prev->sched_class->task_dead) + prev->sched_class->task_dead(prev); + +- /* +- * Remove function-return probe instances associated with this +- * task and put them back on the free list. +- */ +- kprobe_flush_task(prev); +- +- /* Task is done with its stack. */ +- put_task_stack(prev); +- + put_task_struct_rcu_user(prev); + } + + return rq; + } + +-#ifdef CONFIG_SMP +- +-/* rq->lock is NOT held, but preemption is disabled */ +-static void __balance_callback(struct rq *rq) +-{ +- struct callback_head *head, *next; +- void (*func)(struct rq *rq); +- unsigned long flags; +- +- raw_spin_lock_irqsave(&rq->lock, flags); +- head = rq->balance_callback; +- rq->balance_callback = NULL; +- while (head) { +- func = (void (*)(struct rq *))head->func; +- next = head->next; +- head->next = NULL; +- head = next; +- +- func(rq); +- } +- raw_spin_unlock_irqrestore(&rq->lock, flags); +-} +- +-static inline void balance_callback(struct rq *rq) +-{ +- if (unlikely(rq->balance_callback)) +- __balance_callback(rq); +-} +- +-#else +- +-static inline void balance_callback(struct rq *rq) +-{ +-} +- +-#endif +- + /** + * schedule_tail - first thing a freshly forked thread must call. + * @prev: the thread we just switched away from. +@@ -3761,7 +4397,6 @@ asmlinkage __visible void schedule_tail(struct task_struct *prev) + */ + + rq = finish_task_switch(prev); +- balance_callback(rq); + preempt_enable(); + + if (current->set_child_tid) +@@ -4456,7 +5091,7 @@ pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf) + * + * WARNING: must be called with preemption disabled! + */ +-static void __sched notrace __schedule(bool preempt) ++static void __sched notrace __schedule(bool preempt, bool spinning_lock) + { + struct task_struct *prev, *next; + unsigned long *switch_count; +@@ -4509,7 +5144,7 @@ static void __sched notrace __schedule(bool preempt) + * - ptrace_{,un}freeze_traced() can change ->state underneath us. + */ + prev_state = prev->state; +- if (!preempt && prev_state) { ++ if ((!preempt || spinning_lock) && prev_state) { + if (signal_pending_state(prev_state, prev)) { + prev->state = TASK_RUNNING; + } else { +@@ -4544,6 +5179,7 @@ static void __sched notrace __schedule(bool preempt) + + next = pick_next_task(rq, prev, &rf); + clear_tsk_need_resched(prev); ++ clear_tsk_need_resched_lazy(prev); + clear_preempt_need_resched(); + + if (likely(prev != next)) { +@@ -4569,6 +5205,7 @@ static void __sched notrace __schedule(bool preempt) + */ + ++*switch_count; + ++ migrate_disable_switch(rq, prev); + psi_sched_switch(prev, next, !task_on_rq_queued(prev)); + + trace_sched_switch(preempt, prev, next); +@@ -4577,10 +5214,11 @@ static void __sched notrace __schedule(bool preempt) + rq = context_switch(rq, prev, next, &rf); + } else { + rq->clock_update_flags &= ~(RQCF_ACT_SKIP|RQCF_REQ_SKIP); +- rq_unlock_irq(rq, &rf); +- } + +- balance_callback(rq); ++ rq_unpin_lock(rq, &rf); ++ __balance_callbacks(rq); ++ raw_spin_unlock_irq(&rq->lock); ++ } + } + + void __noreturn do_task_dead(void) +@@ -4591,7 +5229,7 @@ void __noreturn do_task_dead(void) + /* Tell freezer to ignore us: */ + current->flags |= PF_NOFREEZE; + +- __schedule(false); ++ __schedule(false, false); + BUG(); + + /* Avoid "noreturn function does return" - but don't continue if BUG() is a NOP: */ +@@ -4624,9 +5262,6 @@ static inline void sched_submit_work(struct task_struct *tsk) + preempt_enable_no_resched(); + } + +- if (tsk_is_pi_blocked(tsk)) +- return; +- + /* + * If we are going to sleep and we have plugged IO queued, + * make sure to submit it to avoid deadlocks. +@@ -4652,7 +5287,7 @@ asmlinkage __visible void __sched schedule(void) + sched_submit_work(tsk); + do { + preempt_disable(); +- __schedule(false); ++ __schedule(false, false); + sched_preempt_enable_no_resched(); + } while (need_resched()); + sched_update_worker(tsk); +@@ -4680,7 +5315,7 @@ void __sched schedule_idle(void) + */ + WARN_ON_ONCE(current->state); + do { +- __schedule(false); ++ __schedule(false, false); + } while (need_resched()); + } + +@@ -4733,7 +5368,7 @@ static void __sched notrace preempt_schedule_common(void) + */ + preempt_disable_notrace(); + preempt_latency_start(1); +- __schedule(true); ++ __schedule(true, false); + preempt_latency_stop(1); + preempt_enable_no_resched_notrace(); + +@@ -4744,6 +5379,30 @@ static void __sched notrace preempt_schedule_common(void) + } while (need_resched()); + } + ++#ifdef CONFIG_PREEMPT_LAZY ++/* ++ * If TIF_NEED_RESCHED is then we allow to be scheduled away since this is ++ * set by a RT task. Oterwise we try to avoid beeing scheduled out as long as ++ * preempt_lazy_count counter >0. ++ */ ++static __always_inline int preemptible_lazy(void) ++{ ++ if (test_thread_flag(TIF_NEED_RESCHED)) ++ return 1; ++ if (current_thread_info()->preempt_lazy_count) ++ return 0; ++ return 1; ++} ++ ++#else ++ ++static inline int preemptible_lazy(void) ++{ ++ return 1; ++} ++ ++#endif ++ + #ifdef CONFIG_PREEMPTION + /* + * This is the entry point to schedule() from in-kernel preemption +@@ -4757,12 +5416,26 @@ asmlinkage __visible void __sched notrace preempt_schedule(void) + */ + if (likely(!preemptible())) + return; +- ++ if (!preemptible_lazy()) ++ return; + preempt_schedule_common(); + } + NOKPROBE_SYMBOL(preempt_schedule); + EXPORT_SYMBOL(preempt_schedule); + ++#ifdef CONFIG_PREEMPT_RT ++void __sched notrace preempt_schedule_lock(void) ++{ ++ do { ++ preempt_disable(); ++ __schedule(true, true); ++ sched_preempt_enable_no_resched(); ++ } while (need_resched()); ++} ++NOKPROBE_SYMBOL(preempt_schedule_lock); ++EXPORT_SYMBOL(preempt_schedule_lock); ++#endif ++ + #ifdef CONFIG_PREEMPT_DYNAMIC + DEFINE_STATIC_CALL(preempt_schedule, __preempt_schedule_func); + EXPORT_STATIC_CALL(preempt_schedule); +@@ -4790,6 +5463,9 @@ asmlinkage __visible void __sched notrace preempt_schedule_notrace(void) + if (likely(!preemptible())) + return; + ++ if (!preemptible_lazy()) ++ return; ++ + do { + /* + * Because the function tracer can trace preempt_count_sub() +@@ -4812,7 +5488,7 @@ asmlinkage __visible void __sched notrace preempt_schedule_notrace(void) + * an infinite recursion. + */ + prev_ctx = exception_enter(); +- __schedule(true); ++ __schedule(true, false); + exception_exit(prev_ctx); + + preempt_latency_stop(1); +@@ -5030,7 +5706,7 @@ asmlinkage __visible void __sched preempt_schedule_irq(void) + do { + preempt_disable(); + local_irq_enable(); +- __schedule(true); ++ __schedule(true, false); + local_irq_disable(); + sched_preempt_enable_no_resched(); + } while (need_resched()); +@@ -5196,9 +5872,11 @@ void rt_mutex_setprio(struct task_struct *p, struct task_struct *pi_task) + out_unlock: + /* Avoid rq from going away on us: */ + preempt_disable(); +- __task_rq_unlock(rq, &rf); + +- balance_callback(rq); ++ rq_unpin_lock(rq, &rf); ++ __balance_callbacks(rq); ++ raw_spin_unlock(&rq->lock); ++ + preempt_enable(); + } + #else +@@ -5441,6 +6119,7 @@ static int __sched_setscheduler(struct task_struct *p, + int oldpolicy = -1, policy = attr->sched_policy; + int retval, oldprio, newprio, queued, running; + const struct sched_class *prev_class; ++ struct callback_head *head; + struct rq_flags rf; + int reset_on_fork; + int queue_flags = DEQUEUE_SAVE | DEQUEUE_MOVE | DEQUEUE_NOCLOCK; +@@ -5695,6 +6374,7 @@ static int __sched_setscheduler(struct task_struct *p, + + /* Avoid rq from going away on us: */ + preempt_disable(); ++ head = splice_balance_callbacks(rq); + task_rq_unlock(rq, p, &rf); + + if (pi) { +@@ -5703,7 +6383,7 @@ static int __sched_setscheduler(struct task_struct *p, + } + + /* Run balance callbacks after we've adjusted the PI chain: */ +- balance_callback(rq); ++ balance_callbacks(rq, head); + preempt_enable(); + + return 0; +@@ -6198,7 +6878,7 @@ long sched_setaffinity(pid_t pid, const struct cpumask *in_mask) + } + #endif + again: +- retval = __set_cpus_allowed_ptr(p, new_mask, true); ++ retval = __set_cpus_allowed_ptr(p, new_mask, SCA_CHECK); + + if (!retval) { + cpuset_cpus_allowed(p, cpus_allowed); +@@ -6784,7 +7464,7 @@ void __init init_idle(struct task_struct *idle, int cpu) + * + * And since this is boot we can forgo the serialization. + */ +- set_cpus_allowed_common(idle, cpumask_of(cpu)); ++ set_cpus_allowed_common(idle, cpumask_of(cpu), 0); + #endif + /* + * We're having a chicken and egg problem, even though we are +@@ -6811,7 +7491,9 @@ void __init init_idle(struct task_struct *idle, int cpu) + + /* Set the preempt count _outside_ the spinlocks! */ + init_idle_preempt_count(idle, cpu); +- ++#ifdef CONFIG_HAVE_PREEMPT_LAZY ++ task_thread_info(idle)->preempt_lazy_count = 0; ++#endif + /* + * The idle tasks have their own, simple scheduling class: + */ +@@ -6916,6 +7598,7 @@ void sched_setnuma(struct task_struct *p, int nid) + #endif /* CONFIG_NUMA_BALANCING */ + + #ifdef CONFIG_HOTPLUG_CPU ++ + /* + * Ensure that the idle task is using init_mm right before its CPU goes + * offline. +@@ -6935,119 +7618,126 @@ void idle_task_exit(void) + /* finish_cpu(), as ran on the BP, will clean up the active_mm state */ + } + +-/* +- * Since this CPU is going 'away' for a while, fold any nr_active delta +- * we might have. Assumes we're called after migrate_tasks() so that the +- * nr_active count is stable. We need to take the teardown thread which +- * is calling this into account, so we hand in adjust = 1 to the load +- * calculation. +- * +- * Also see the comment "Global load-average calculations". +- */ +-static void calc_load_migrate(struct rq *rq) ++static int __balance_push_cpu_stop(void *arg) + { +- long delta = calc_load_fold_active(rq, 1); +- if (delta) +- atomic_long_add(delta, &calc_load_tasks); +-} ++ struct task_struct *p = arg; ++ struct rq *rq = this_rq(); ++ struct rq_flags rf; ++ int cpu; + +-static struct task_struct *__pick_migrate_task(struct rq *rq) +-{ +- const struct sched_class *class; +- struct task_struct *next; ++ raw_spin_lock_irq(&p->pi_lock); ++ rq_lock(rq, &rf); + +- for_each_class(class) { +- next = class->pick_next_task(rq); +- if (next) { +- next->sched_class->put_prev_task(rq, next); +- return next; +- } ++ update_rq_clock(rq); ++ ++ if (task_rq(p) == rq && task_on_rq_queued(p)) { ++ cpu = select_fallback_rq(rq->cpu, p); ++ rq = __migrate_task(rq, &rf, p, cpu); + } + +- /* The idle class should always have a runnable task */ +- BUG(); ++ rq_unlock(rq, &rf); ++ raw_spin_unlock_irq(&p->pi_lock); ++ ++ put_task_struct(p); ++ ++ return 0; + } + ++static DEFINE_PER_CPU(struct cpu_stop_work, push_work); ++ + /* +- * Migrate all tasks from the rq, sleeping tasks will be migrated by +- * try_to_wake_up()->select_task_rq(). +- * +- * Called with rq->lock held even though we'er in stop_machine() and +- * there's no concurrency possible, we hold the required locks anyway +- * because of lock validation efforts. ++ * Ensure we only run per-cpu kthreads once the CPU goes !active. + */ +-static void migrate_tasks(struct rq *dead_rq, struct rq_flags *rf) ++static void balance_push(struct rq *rq) + { +- struct rq *rq = dead_rq; +- struct task_struct *next, *stop = rq->stop; +- struct rq_flags orf = *rf; +- int dest_cpu; ++ struct task_struct *push_task = rq->curr; ++ ++ lockdep_assert_held(&rq->lock); ++ SCHED_WARN_ON(rq->cpu != smp_processor_id()); + + /* +- * Fudge the rq selection such that the below task selection loop +- * doesn't get stuck on the currently eligible stop task. +- * +- * We're currently inside stop_machine() and the rq is either stuck +- * in the stop_machine_cpu_stop() loop, or we're executing this code, +- * either way we should never end up calling schedule() until we're +- * done here. ++ * Both the cpu-hotplug and stop task are in this case and are ++ * required to complete the hotplug process. + */ +- rq->stop = NULL; ++ if (is_per_cpu_kthread(push_task) || is_migration_disabled(push_task)) { ++ /* ++ * If this is the idle task on the outgoing CPU try to wake ++ * up the hotplug control thread which might wait for the ++ * last task to vanish. The rcuwait_active() check is ++ * accurate here because the waiter is pinned on this CPU ++ * and can't obviously be running in parallel. ++ * ++ * On RT kernels this also has to check whether there are ++ * pinned and scheduled out tasks on the runqueue. They ++ * need to leave the migrate disabled section first. ++ */ ++ if (!rq->nr_running && !rq_has_pinned_tasks(rq) && ++ rcuwait_active(&rq->hotplug_wait)) { ++ raw_spin_unlock(&rq->lock); ++ rcuwait_wake_up(&rq->hotplug_wait); ++ raw_spin_lock(&rq->lock); ++ } ++ return; ++ } + ++ get_task_struct(push_task); + /* +- * put_prev_task() and pick_next_task() sched +- * class method both need to have an up-to-date +- * value of rq->clock[_task] ++ * Temporarily drop rq->lock such that we can wake-up the stop task. ++ * Both preemption and IRQs are still disabled. + */ +- update_rq_clock(rq); ++ raw_spin_unlock(&rq->lock); ++ stop_one_cpu_nowait(rq->cpu, __balance_push_cpu_stop, push_task, ++ this_cpu_ptr(&push_work)); ++ /* ++ * At this point need_resched() is true and we'll take the loop in ++ * schedule(). The next pick is obviously going to be the stop task ++ * which is_per_cpu_kthread() and will push this task away. ++ */ ++ raw_spin_lock(&rq->lock); ++} + +- for (;;) { +- /* +- * There's this thread running, bail when that's the only +- * remaining thread: +- */ +- if (rq->nr_running == 1) +- break; ++static void balance_push_set(int cpu, bool on) ++{ ++ struct rq *rq = cpu_rq(cpu); ++ struct rq_flags rf; + +- next = __pick_migrate_task(rq); ++ rq_lock_irqsave(rq, &rf); ++ if (on) ++ rq->balance_flags |= BALANCE_PUSH; ++ else ++ rq->balance_flags &= ~BALANCE_PUSH; ++ rq_unlock_irqrestore(rq, &rf); ++} + +- /* +- * Rules for changing task_struct::cpus_mask are holding +- * both pi_lock and rq->lock, such that holding either +- * stabilizes the mask. +- * +- * Drop rq->lock is not quite as disastrous as it usually is +- * because !cpu_active at this point, which means load-balance +- * will not interfere. Also, stop-machine. +- */ +- rq_unlock(rq, rf); +- raw_spin_lock(&next->pi_lock); +- rq_relock(rq, rf); ++/* ++ * Invoked from a CPUs hotplug control thread after the CPU has been marked ++ * inactive. All tasks which are not per CPU kernel threads are either ++ * pushed off this CPU now via balance_push() or placed on a different CPU ++ * during wakeup. Wait until the CPU is quiescent. ++ */ ++static void balance_hotplug_wait(void) ++{ ++ struct rq *rq = this_rq(); + +- /* +- * Since we're inside stop-machine, _nothing_ should have +- * changed the task, WARN if weird stuff happened, because in +- * that case the above rq->lock drop is a fail too. +- */ +- if (WARN_ON(task_rq(next) != rq || !task_on_rq_queued(next))) { +- raw_spin_unlock(&next->pi_lock); +- continue; +- } ++ rcuwait_wait_event(&rq->hotplug_wait, ++ rq->nr_running == 1 && !rq_has_pinned_tasks(rq), ++ TASK_UNINTERRUPTIBLE); ++} + +- /* Find suitable destination for @next, with force if needed. */ +- dest_cpu = select_fallback_rq(dead_rq->cpu, next); +- rq = __migrate_task(rq, rf, next, dest_cpu); +- if (rq != dead_rq) { +- rq_unlock(rq, rf); +- rq = dead_rq; +- *rf = orf; +- rq_relock(rq, rf); +- } +- raw_spin_unlock(&next->pi_lock); +- } ++#else ++ ++static inline void balance_push(struct rq *rq) ++{ ++} + +- rq->stop = stop; ++static inline void balance_push_set(int cpu, bool on) ++{ ++} ++ ++static inline void balance_hotplug_wait(void) ++{ + } ++ + #endif /* CONFIG_HOTPLUG_CPU */ + + void set_rq_online(struct rq *rq) +@@ -7133,6 +7823,8 @@ int sched_cpu_activate(unsigned int cpu) + struct rq *rq = cpu_rq(cpu); + struct rq_flags rf; + ++ balance_push_set(cpu, false); ++ + #ifdef CONFIG_SCHED_SMT + /* + * When going up, increment the number of cores with SMT present. +@@ -7168,6 +7860,8 @@ int sched_cpu_activate(unsigned int cpu) + + int sched_cpu_deactivate(unsigned int cpu) + { ++ struct rq *rq = cpu_rq(cpu); ++ struct rq_flags rf; + int ret; + + set_cpu_active(cpu, false); +@@ -7180,6 +7874,16 @@ int sched_cpu_deactivate(unsigned int cpu) + */ + synchronize_rcu(); + ++ balance_push_set(cpu, true); ++ ++ rq_lock_irqsave(rq, &rf); ++ if (rq->rd) { ++ update_rq_clock(rq); ++ BUG_ON(!cpumask_test_cpu(cpu, rq->rd->span)); ++ set_rq_offline(rq); ++ } ++ rq_unlock_irqrestore(rq, &rf); ++ + #ifdef CONFIG_SCHED_SMT + /* + * When going down, decrement the number of cores with SMT present. +@@ -7193,6 +7897,7 @@ int sched_cpu_deactivate(unsigned int cpu) + + ret = cpuset_cpu_inactive(cpu); + if (ret) { ++ balance_push_set(cpu, false); + set_cpu_active(cpu, true); + return ret; + } +@@ -7216,6 +7921,41 @@ int sched_cpu_starting(unsigned int cpu) + } + + #ifdef CONFIG_HOTPLUG_CPU ++ ++/* ++ * Invoked immediately before the stopper thread is invoked to bring the ++ * CPU down completely. At this point all per CPU kthreads except the ++ * hotplug thread (current) and the stopper thread (inactive) have been ++ * either parked or have been unbound from the outgoing CPU. Ensure that ++ * any of those which might be on the way out are gone. ++ * ++ * If after this point a bound task is being woken on this CPU then the ++ * responsible hotplug callback has failed to do it's job. ++ * sched_cpu_dying() will catch it with the appropriate fireworks. ++ */ ++int sched_cpu_wait_empty(unsigned int cpu) ++{ ++ balance_hotplug_wait(); ++ return 0; ++} ++ ++/* ++ * Since this CPU is going 'away' for a while, fold any nr_active delta we ++ * might have. Called from the CPU stopper task after ensuring that the ++ * stopper is the last running task on the CPU, so nr_active count is ++ * stable. We need to take the teardown thread which is calling this into ++ * account, so we hand in adjust = 1 to the load calculation. ++ * ++ * Also see the comment "Global load-average calculations". ++ */ ++static void calc_load_migrate(struct rq *rq) ++{ ++ long delta = calc_load_fold_active(rq, 1); ++ ++ if (delta) ++ atomic_long_add(delta, &calc_load_tasks); ++} ++ + int sched_cpu_dying(unsigned int cpu) + { + struct rq *rq = cpu_rq(cpu); +@@ -7225,12 +7965,7 @@ int sched_cpu_dying(unsigned int cpu) + sched_tick_stop(cpu); + + rq_lock_irqsave(rq, &rf); +- if (rq->rd) { +- BUG_ON(!cpumask_test_cpu(cpu, rq->rd->span)); +- set_rq_offline(rq); +- } +- migrate_tasks(rq, &rf); +- BUG_ON(rq->nr_running != 1); ++ BUG_ON(rq->nr_running != 1 || rq_has_pinned_tasks(rq)); + rq_unlock_irqrestore(rq, &rf); + + calc_load_migrate(rq); +@@ -7440,6 +8175,9 @@ void __init sched_init(void) + + INIT_CSD(&rq->nohz_csd, nohz_csd_func, rq); + #endif ++#ifdef CONFIG_HOTPLUG_CPU ++ rcuwait_init(&rq->hotplug_wait); ++#endif + #endif /* CONFIG_SMP */ + hrtick_rq_init(rq); + atomic_set(&rq->nr_iowait, 0); +@@ -7480,7 +8218,7 @@ void __init sched_init(void) + #ifdef CONFIG_DEBUG_ATOMIC_SLEEP + static inline int preempt_count_equals(int preempt_offset) + { +- int nested = preempt_count() + rcu_preempt_depth(); ++ int nested = preempt_count() + sched_rcu_preempt_depth(); + + return (nested == preempt_offset); + } +@@ -7577,6 +8315,39 @@ void __cant_sleep(const char *file, int line, int preempt_offset) + add_taint(TAINT_WARN, LOCKDEP_STILL_OK); + } + EXPORT_SYMBOL_GPL(__cant_sleep); ++ ++#ifdef CONFIG_SMP ++void __cant_migrate(const char *file, int line) ++{ ++ static unsigned long prev_jiffy; ++ ++ if (irqs_disabled()) ++ return; ++ ++ if (is_migration_disabled(current)) ++ return; ++ ++ if (!IS_ENABLED(CONFIG_PREEMPT_COUNT)) ++ return; ++ ++ if (preempt_count() > 0) ++ return; ++ ++ if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy) ++ return; ++ prev_jiffy = jiffies; ++ ++ pr_err("BUG: assuming non migratable context at %s:%d\n", file, line); ++ pr_err("in_atomic(): %d, irqs_disabled(): %d, migration_disabled() %u pid: %d, name: %s\n", ++ in_atomic(), irqs_disabled(), is_migration_disabled(current), ++ current->pid, current->comm); ++ ++ debug_show_held_locks(current); ++ dump_stack(); ++ add_taint(TAINT_WARN, LOCKDEP_STILL_OK); ++} ++EXPORT_SYMBOL_GPL(__cant_migrate); ++#endif + #endif + + #ifdef CONFIG_MAGIC_SYSRQ +diff --git a/kernel/sched/cpudeadline.c b/kernel/sched/cpudeadline.c +index 8cb06c8c7..ceb03d76c 100644 +--- a/kernel/sched/cpudeadline.c ++++ b/kernel/sched/cpudeadline.c +@@ -120,7 +120,7 @@ int cpudl_find(struct cpudl *cp, struct task_struct *p, + const struct sched_dl_entity *dl_se = &p->dl; + + if (later_mask && +- cpumask_and(later_mask, cp->free_cpus, p->cpus_ptr)) { ++ cpumask_and(later_mask, cp->free_cpus, &p->cpus_mask)) { + unsigned long cap, max_cap = 0; + int cpu, max_cpu = -1; + +@@ -151,7 +151,7 @@ int cpudl_find(struct cpudl *cp, struct task_struct *p, + + WARN_ON(best_cpu != -1 && !cpu_present(best_cpu)); + +- if (cpumask_test_cpu(best_cpu, p->cpus_ptr) && ++ if (cpumask_test_cpu(best_cpu, &p->cpus_mask) && + dl_time_before(dl_se->deadline, cp->elements[0].dl)) { + if (later_mask) + cpumask_set_cpu(best_cpu, later_mask); +diff --git a/kernel/sched/cpupri.c b/kernel/sched/cpupri.c +index 0033731a0..11c4df201 100644 +--- a/kernel/sched/cpupri.c ++++ b/kernel/sched/cpupri.c +@@ -73,11 +73,11 @@ static inline int __cpupri_find(struct cpupri *cp, struct task_struct *p, + if (skip) + return 0; + +- if (cpumask_any_and(p->cpus_ptr, vec->mask) >= nr_cpu_ids) ++ if (cpumask_any_and(&p->cpus_mask, vec->mask) >= nr_cpu_ids) + return 0; + + if (lowest_mask) { +- cpumask_and(lowest_mask, p->cpus_ptr, vec->mask); ++ cpumask_and(lowest_mask, &p->cpus_mask, vec->mask); + + /* + * We have to ensure that we have at least one bit +diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c +index 5a55d2300..2c36a5fad 100644 +--- a/kernel/sched/cputime.c ++++ b/kernel/sched/cputime.c +@@ -44,12 +44,13 @@ static void irqtime_account_delta(struct irqtime *irqtime, u64 delta, + } + + /* +- * Called before incrementing preempt_count on {soft,}irq_enter ++ * Called after incrementing preempt_count on {soft,}irq_enter + * and before decrementing preempt_count on {soft,}irq_exit. + */ +-void irqtime_account_irq(struct task_struct *curr) ++void irqtime_account_irq(struct task_struct *curr, unsigned int offset) + { + struct irqtime *irqtime = this_cpu_ptr(&cpu_irqtime); ++ unsigned int pc; + s64 delta; + int cpu; + +@@ -59,6 +60,7 @@ void irqtime_account_irq(struct task_struct *curr) + cpu = smp_processor_id(); + delta = sched_clock_cpu(cpu) - irqtime->irq_start_time; + irqtime->irq_start_time += delta; ++ pc = irq_count() - offset; + + /* + * We do not account for softirq time from ksoftirqd here. +@@ -66,12 +68,11 @@ void irqtime_account_irq(struct task_struct *curr) + * in that case, so as not to confuse scheduler with a special task + * that do not consume any time, but still wants to run. + */ +- if (hardirq_count()) ++ if (pc & HARDIRQ_MASK) + irqtime_account_delta(irqtime, delta, CPUTIME_IRQ); +- else if (in_serving_softirq() && curr != this_cpu_ksoftirqd()) ++ else if ((pc & SOFTIRQ_OFFSET) && curr != this_cpu_ksoftirqd()) + irqtime_account_delta(irqtime, delta, CPUTIME_SOFTIRQ); + } +-EXPORT_SYMBOL_GPL(irqtime_account_irq); + + static u64 irqtime_tick_accounted(u64 maxtime) + { +@@ -418,24 +419,21 @@ void vtime_task_switch(struct task_struct *prev) + } + # endif + +-/* +- * Archs that account the whole time spent in the idle task +- * (outside irq) as idle time can rely on this and just implement +- * vtime_account_kernel() and vtime_account_idle(). Archs that +- * have other meaning of the idle time (s390 only includes the +- * time spent by the CPU when it's in low power mode) must override +- * vtime_account(). +- */ +-#ifndef __ARCH_HAS_VTIME_ACCOUNT +-void vtime_account_irq_enter(struct task_struct *tsk) ++void vtime_account_irq(struct task_struct *tsk, unsigned int offset) + { +- if (!in_interrupt() && is_idle_task(tsk)) ++ unsigned int pc = irq_count() - offset; ++ ++ if (pc & HARDIRQ_OFFSET) { ++ vtime_account_hardirq(tsk); ++ } else if (pc & SOFTIRQ_OFFSET) { ++ vtime_account_softirq(tsk); ++ } else if (!IS_ENABLED(CONFIG_HAVE_VIRT_CPU_ACCOUNTING_IDLE) && ++ is_idle_task(tsk)) { + vtime_account_idle(tsk); +- else ++ } else { + vtime_account_kernel(tsk); ++ } + } +-EXPORT_SYMBOL_GPL(vtime_account_irq_enter); +-#endif /* __ARCH_HAS_VTIME_ACCOUNT */ + + void cputime_adjust(struct task_cputime *curr, struct prev_cputime *prev, + u64 *ut, u64 *st) +diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c +index 8255267ce..5ab09ef74 100644 +--- a/kernel/sched/deadline.c ++++ b/kernel/sched/deadline.c +@@ -565,7 +565,7 @@ static int push_dl_task(struct rq *rq); + + static inline bool need_pull_dl_task(struct rq *rq, struct task_struct *prev) + { +- return dl_task(prev); ++ return rq->online && dl_task(prev); + } + + static DEFINE_PER_CPU(struct callback_head, dl_push_head); +@@ -1919,7 +1919,7 @@ static void task_fork_dl(struct task_struct *p) + static int pick_dl_task(struct rq *rq, struct task_struct *p, int cpu) + { + if (!task_running(rq, p) && +- cpumask_test_cpu(cpu, p->cpus_ptr)) ++ cpumask_test_cpu(cpu, &p->cpus_mask)) + return 1; + return 0; + } +@@ -2009,8 +2009,8 @@ static int find_later_rq(struct task_struct *task) + return this_cpu; + } + +- best_cpu = cpumask_first_and(later_mask, +- sched_domain_span(sd)); ++ best_cpu = cpumask_any_and_distribute(later_mask, ++ sched_domain_span(sd)); + /* + * Last chance: if a CPU being in both later_mask + * and current sd span is valid, that becomes our +@@ -2032,7 +2032,7 @@ static int find_later_rq(struct task_struct *task) + if (this_cpu != -1) + return this_cpu; + +- cpu = cpumask_any(later_mask); ++ cpu = cpumask_any_distribute(later_mask); + if (cpu < nr_cpu_ids) + return cpu; + +@@ -2097,7 +2097,7 @@ static struct rq *find_lock_later_rq(struct task_struct *task, struct rq *rq) + */ + next_task = pick_next_pushable_dl_task(rq); + if (unlikely(next_task != task || +- !cpumask_test_cpu(later_rq->cpu, task->cpus_ptr))) { ++ !cpumask_test_cpu(later_rq->cpu, &task->cpus_mask))) { + double_unlock_balance(rq, later_rq); + later_rq = NULL; + break; +@@ -2141,6 +2141,9 @@ static int push_dl_task(struct rq *rq) + return 0; + + retry: ++ if (is_migration_disabled(next_task)) ++ return 0; ++ + if (WARN_ON(next_task == rq->curr)) + return 0; + +@@ -2218,7 +2221,7 @@ static void push_dl_tasks(struct rq *rq) + static void pull_dl_task(struct rq *this_rq) + { + int this_cpu = this_rq->cpu, cpu; +- struct task_struct *p; ++ struct task_struct *p, *push_task; + bool resched = false; + struct rq *src_rq; + u64 dmin = LONG_MAX; +@@ -2248,6 +2251,7 @@ static void pull_dl_task(struct rq *this_rq) + continue; + + /* Might drop this_rq->lock */ ++ push_task = NULL; + double_lock_balance(this_rq, src_rq); + + /* +@@ -2279,17 +2283,28 @@ static void pull_dl_task(struct rq *this_rq) + src_rq->curr->dl.deadline)) + goto skip; + +- resched = true; +- +- deactivate_task(src_rq, p, 0); +- set_task_cpu(p, this_cpu); +- activate_task(this_rq, p, 0); +- dmin = p->dl.deadline; ++ if (is_migration_disabled(p)) { ++ trace_sched_migrate_pull_tp(p); ++ push_task = get_push_task(src_rq); ++ } else { ++ deactivate_task(src_rq, p, 0); ++ set_task_cpu(p, this_cpu); ++ activate_task(this_rq, p, 0); ++ dmin = p->dl.deadline; ++ resched = true; ++ } + + /* Is there any other task even earlier? */ + } + skip: + double_unlock_balance(this_rq, src_rq); ++ ++ if (push_task) { ++ raw_spin_unlock(&this_rq->lock); ++ stop_one_cpu_nowait(src_rq->cpu, push_cpu_stop, ++ push_task, &src_rq->push_work); ++ raw_spin_lock(&this_rq->lock); ++ } + } + + if (resched) +@@ -2313,7 +2328,8 @@ static void task_woken_dl(struct rq *rq, struct task_struct *p) + } + + static void set_cpus_allowed_dl(struct task_struct *p, +- const struct cpumask *new_mask) ++ const struct cpumask *new_mask, ++ u32 flags) + { + struct root_domain *src_rd; + struct rq *rq; +@@ -2342,7 +2358,7 @@ static void set_cpus_allowed_dl(struct task_struct *p, + raw_spin_unlock(&src_dl_b->lock); + } + +- set_cpus_allowed_common(p, new_mask); ++ set_cpus_allowed_common(p, new_mask, flags); + } + + /* Assumes rq->lock is held */ +@@ -2537,6 +2553,7 @@ const struct sched_class dl_sched_class + .rq_online = rq_online_dl, + .rq_offline = rq_offline_dl, + .task_woken = task_woken_dl, ++ .find_lock_rq = find_lock_later_rq, + #endif + + .task_tick = task_tick_dl, +diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c +index 26ea78ae3..1b0eaa9f0 100644 +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -4484,7 +4484,7 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) + ideal_runtime = sched_slice(cfs_rq, curr); + delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime; + if (delta_exec > ideal_runtime) { +- resched_curr(rq_of(cfs_rq)); ++ resched_curr_lazy(rq_of(cfs_rq)); + /* + * The current task ran long enough, ensure it doesn't get + * re-elected due to buddy favours. +@@ -4508,7 +4508,7 @@ check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) + return; + + if (delta > ideal_runtime) +- resched_curr(rq_of(cfs_rq)); ++ resched_curr_lazy(rq_of(cfs_rq)); + } + + static void +@@ -4651,7 +4651,7 @@ entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr, int queued) + * validating it and just reschedule. + */ + if (queued) { +- resched_curr(rq_of(cfs_rq)); ++ resched_curr_lazy(rq_of(cfs_rq)); + return; + } + /* +@@ -4788,7 +4788,7 @@ static void __account_cfs_rq_runtime(struct cfs_rq *cfs_rq, u64 delta_exec) + * hierarchy can be throttled + */ + if (!assign_cfs_rq_runtime(cfs_rq) && likely(cfs_rq->curr)) +- resched_curr(rq_of(cfs_rq)); ++ resched_curr_lazy(rq_of(cfs_rq)); + } + + static __always_inline +@@ -5537,7 +5537,7 @@ static void hrtick_start_fair(struct rq *rq, struct task_struct *p) + + if (delta < 0) { + if (rq->curr == p) +- resched_curr(rq); ++ resched_curr_lazy(rq); + return; + } + hrtick_start(rq, delta); +@@ -7144,7 +7144,7 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int wake_ + return; + + preempt: +- resched_curr(rq); ++ resched_curr_lazy(rq); + /* + * Only set the backward buddy when the current task is still + * on the rq. This can happen when a wakeup gets interleaved +@@ -11335,7 +11335,7 @@ static void task_fork_fair(struct task_struct *p) + * 'current' within the tree based on its new key value. + */ + swap(curr->vruntime, se->vruntime); +- resched_curr(rq); ++ resched_curr_lazy(rq); + } + + se->vruntime -= cfs_rq->min_vruntime; +@@ -11362,7 +11362,7 @@ prio_changed_fair(struct rq *rq, struct task_struct *p, int oldprio) + */ + if (rq->curr == p) { + if (p->prio > oldprio) +- resched_curr(rq); ++ resched_curr_lazy(rq); + } else + check_preempt_curr(rq, p, 0); + } +diff --git a/kernel/sched/features.h b/kernel/sched/features.h +index 97ed11bd2..0dade2e74 100644 +--- a/kernel/sched/features.h ++++ b/kernel/sched/features.h +@@ -45,11 +45,19 @@ SCHED_FEAT(DOUBLE_TICK, false) + */ + SCHED_FEAT(NONTASK_CAPACITY, true) + ++#ifdef CONFIG_PREEMPT_RT ++SCHED_FEAT(TTWU_QUEUE, false) ++# ifdef CONFIG_PREEMPT_LAZY ++SCHED_FEAT(PREEMPT_LAZY, true) ++# endif ++#else ++ + /* + * Queue remote wakeups on the target CPU and process them + * using the scheduler IPI. Reduces rq->lock contention/bounces. + */ + SCHED_FEAT(TTWU_QUEUE, true) ++#endif + + /* + * When doing wakeups, attempt to limit superfluous scans of the LLC domain. +diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c +index dae1e8eaa..86f97f15a 100644 +--- a/kernel/sched/rt.c ++++ b/kernel/sched/rt.c +@@ -265,7 +265,7 @@ static void pull_rt_task(struct rq *this_rq); + static inline bool need_pull_rt_task(struct rq *rq, struct task_struct *prev) + { + /* Try to pull RT tasks here if we lower this rq's prio */ +- return rq->rt.highest_prio.curr > prev->prio; ++ return rq->online && rq->rt.highest_prio.curr > prev->prio; + } + + static inline int rt_overloaded(struct rq *rq) +@@ -1672,7 +1672,7 @@ static void put_prev_task_rt(struct rq *rq, struct task_struct *p) + static int pick_rt_task(struct rq *rq, struct task_struct *p, int cpu) + { + if (!task_running(rq, p) && +- cpumask_test_cpu(cpu, p->cpus_ptr)) ++ cpumask_test_cpu(cpu, &p->cpus_mask)) + return 1; + + return 0; +@@ -1766,8 +1766,8 @@ static int find_lowest_rq(struct task_struct *task) + return this_cpu; + } + +- best_cpu = cpumask_first_and(lowest_mask, +- sched_domain_span(sd)); ++ best_cpu = cpumask_any_and_distribute(lowest_mask, ++ sched_domain_span(sd)); + if (best_cpu < nr_cpu_ids) { + rcu_read_unlock(); + return best_cpu; +@@ -1784,7 +1784,7 @@ static int find_lowest_rq(struct task_struct *task) + if (this_cpu != -1) + return this_cpu; + +- cpu = cpumask_any(lowest_mask); ++ cpu = cpumask_any_distribute(lowest_mask); + if (cpu < nr_cpu_ids) + return cpu; + +@@ -1845,7 +1845,7 @@ static struct rq *find_lock_lowest_rq(struct task_struct *task, struct rq *rq) + */ + struct task_struct *next_task = pick_next_pushable_task(rq); + if (unlikely(next_task != task || +- !cpumask_test_cpu(lowest_rq->cpu, task->cpus_ptr))) { ++ !cpumask_test_cpu(lowest_rq->cpu, &task->cpus_mask))) { + double_unlock_balance(rq, lowest_rq); + lowest_rq = NULL; + break; +@@ -1869,7 +1869,7 @@ static struct rq *find_lock_lowest_rq(struct task_struct *task, struct rq *rq) + * running task can migrate over to a CPU that is running a task + * of lesser priority. + */ +-static int push_rt_task(struct rq *rq) ++static int push_rt_task(struct rq *rq, bool pull) + { + struct task_struct *next_task; + struct rq *lowest_rq; +@@ -1883,6 +1883,39 @@ static int push_rt_task(struct rq *rq) + return 0; + + retry: ++ if (is_migration_disabled(next_task)) { ++ struct task_struct *push_task = NULL; ++ int cpu; ++ ++ if (!pull) ++ return 0; ++ ++ trace_sched_migrate_pull_tp(next_task); ++ ++ if (rq->push_busy) ++ return 0; ++ ++ cpu = find_lowest_rq(rq->curr); ++ if (cpu == -1 || cpu == rq->cpu) ++ return 0; ++ ++ /* ++ * Given we found a CPU with lower priority than @next_task, ++ * therefore it should be running. However we cannot migrate it ++ * to this other CPU, instead attempt to push the current ++ * running task on this CPU away. ++ */ ++ push_task = get_push_task(rq); ++ if (push_task) { ++ raw_spin_unlock(&rq->lock); ++ stop_one_cpu_nowait(rq->cpu, push_cpu_stop, ++ push_task, &rq->push_work); ++ raw_spin_lock(&rq->lock); ++ } ++ ++ return 0; ++ } ++ + if (WARN_ON(next_task == rq->curr)) + return 0; + +@@ -1937,12 +1970,10 @@ static int push_rt_task(struct rq *rq) + deactivate_task(rq, next_task, 0); + set_task_cpu(next_task, lowest_rq->cpu); + activate_task(lowest_rq, next_task, 0); +- ret = 1; +- + resched_curr(lowest_rq); ++ ret = 1; + + double_unlock_balance(rq, lowest_rq); +- + out: + put_task_struct(next_task); + +@@ -1952,7 +1983,7 @@ static int push_rt_task(struct rq *rq) + static void push_rt_tasks(struct rq *rq) + { + /* push_rt_task will return true if it moved an RT */ +- while (push_rt_task(rq)) ++ while (push_rt_task(rq, false)) + ; + } + +@@ -2105,7 +2136,8 @@ void rto_push_irq_work_func(struct irq_work *work) + */ + if (has_pushable_tasks(rq)) { + raw_spin_lock(&rq->lock); +- push_rt_tasks(rq); ++ while (push_rt_task(rq, true)) ++ ; + raw_spin_unlock(&rq->lock); + } + +@@ -2130,7 +2162,7 @@ static void pull_rt_task(struct rq *this_rq) + { + int this_cpu = this_rq->cpu, cpu; + bool resched = false; +- struct task_struct *p; ++ struct task_struct *p, *push_task; + struct rq *src_rq; + int rt_overload_count = rt_overloaded(this_rq); + +@@ -2177,6 +2209,7 @@ static void pull_rt_task(struct rq *this_rq) + * double_lock_balance, and another CPU could + * alter this_rq + */ ++ push_task = NULL; + double_lock_balance(this_rq, src_rq); + + /* +@@ -2204,11 +2237,15 @@ static void pull_rt_task(struct rq *this_rq) + if (p->prio < src_rq->curr->prio) + goto skip; + +- resched = true; +- +- deactivate_task(src_rq, p, 0); +- set_task_cpu(p, this_cpu); +- activate_task(this_rq, p, 0); ++ if (is_migration_disabled(p)) { ++ trace_sched_migrate_pull_tp(p); ++ push_task = get_push_task(src_rq); ++ } else { ++ deactivate_task(src_rq, p, 0); ++ set_task_cpu(p, this_cpu); ++ activate_task(this_rq, p, 0); ++ resched = true; ++ } + /* + * We continue with the search, just in + * case there's an even higher prio task +@@ -2218,6 +2255,13 @@ static void pull_rt_task(struct rq *this_rq) + } + skip: + double_unlock_balance(this_rq, src_rq); ++ ++ if (push_task) { ++ raw_spin_unlock(&this_rq->lock); ++ stop_one_cpu_nowait(src_rq->cpu, push_cpu_stop, ++ push_task, &src_rq->push_work); ++ raw_spin_lock(&this_rq->lock); ++ } + } + + if (resched) +@@ -2466,6 +2510,7 @@ const struct sched_class rt_sched_class + .rq_offline = rq_offline_rt, + .task_woken = task_woken_rt, + .switched_from = switched_from_rt, ++ .find_lock_rq = find_lock_lowest_rq, + #endif + + .task_tick = task_tick_rt, +diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h +index fadd38187..2883bc631 100644 +--- a/kernel/sched/sched.h ++++ b/kernel/sched/sched.h +@@ -1012,6 +1012,7 @@ struct rq { + unsigned long cpu_capacity_orig; + + struct callback_head *balance_callback; ++ unsigned char balance_flags; + + unsigned char nohz_idle_balance; + unsigned char idle_balance; +@@ -1042,6 +1043,10 @@ struct rq { + + /* This is used to determine avg_idle's max value */ + u64 max_idle_balance_cost; ++ ++#ifdef CONFIG_HOTPLUG_CPU ++ struct rcuwait hotplug_wait; ++#endif + #endif /* CONFIG_SMP */ + + #ifdef CONFIG_IRQ_TIME_ACCOUNTING +@@ -1100,6 +1105,12 @@ struct rq { + struct cpuidle_state *idle_state; + #endif + ++#ifdef CONFIG_SMP ++ unsigned int nr_pinned; ++#endif ++ unsigned int push_busy; ++ struct cpu_stop_work push_work; ++ + KABI_RESERVE(1) + KABI_RESERVE(2) + KABI_RESERVE(3) +@@ -1135,6 +1146,17 @@ static inline int cpu_of(struct rq *rq) + #endif + } + ++#define MDF_PUSH 0x01 ++ ++static inline bool is_migration_disabled(struct task_struct *p) ++{ ++#ifdef CONFIG_SMP ++ return p->migration_disabled; ++#else ++ return false; ++#endif ++} ++ + #ifdef CONFIG_QOS_SCHED + void init_qos_hrtimer(int cpu); + #endif +@@ -1284,6 +1306,9 @@ static inline void rq_pin_lock(struct rq *rq, struct rq_flags *rf) + rq->clock_update_flags &= (RQCF_REQ_SKIP|RQCF_ACT_SKIP); + rf->clock_update_flags = 0; + #endif ++#ifdef CONFIG_SMP ++ SCHED_WARN_ON(rq->balance_callback); ++#endif + } + + static inline void rq_unpin_lock(struct rq *rq, struct rq_flags *rf) +@@ -1449,6 +1474,9 @@ init_numa_balancing(unsigned long clone_flags, struct task_struct *p) + + #ifdef CONFIG_SMP + ++#define BALANCE_WORK 0x01 ++#define BALANCE_PUSH 0x02 ++ + static inline void + queue_balance_callback(struct rq *rq, + struct callback_head *head, +@@ -1456,12 +1484,13 @@ queue_balance_callback(struct rq *rq, + { + lockdep_assert_held(&rq->lock); + +- if (unlikely(head->next)) ++ if (unlikely(head->next || (rq->balance_flags & BALANCE_PUSH))) + return; + + head->func = (void (*)(struct callback_head *))func; + head->next = rq->balance_callback; + rq->balance_callback = head; ++ rq->balance_flags |= BALANCE_WORK; + } + + #define rcu_dereference_check_sched_domain(p) \ +@@ -1786,6 +1815,7 @@ static inline int task_on_rq_migrating(struct task_struct *p) + #define WF_FORK 0x02 /* Child wakeup after fork */ + #define WF_MIGRATED 0x04 /* Internal use, task got migrated */ + #define WF_ON_CPU 0x08 /* Wakee is on_cpu */ ++#define WF_LOCK_SLEEPER 0x10 /* Wakeup spinlock "sleeper" */ + + /* + * To aid in avoiding the subversion of "niceness" due to uneven distribution +@@ -1867,10 +1897,13 @@ struct sched_class { + void (*task_woken)(struct rq *this_rq, struct task_struct *task); + + void (*set_cpus_allowed)(struct task_struct *p, +- const struct cpumask *newmask); ++ const struct cpumask *newmask, ++ u32 flags); + + void (*rq_online)(struct rq *rq); + void (*rq_offline)(struct rq *rq); ++ ++ struct rq *(*find_lock_rq)(struct task_struct *p, struct rq *rq); + #endif + + void (*task_tick)(struct rq *rq, struct task_struct *p, int queued); +@@ -1957,13 +1990,38 @@ static inline bool sched_fair_runnable(struct rq *rq) + extern struct task_struct *pick_next_task_fair(struct rq *rq, struct task_struct *prev, struct rq_flags *rf); + extern struct task_struct *pick_next_task_idle(struct rq *rq); + ++#define SCA_CHECK 0x01 ++#define SCA_MIGRATE_DISABLE 0x02 ++#define SCA_MIGRATE_ENABLE 0x04 ++ + #ifdef CONFIG_SMP + + extern void update_group_capacity(struct sched_domain *sd, int cpu); + + extern void trigger_load_balance(struct rq *rq); + +-extern void set_cpus_allowed_common(struct task_struct *p, const struct cpumask *new_mask); ++extern void set_cpus_allowed_common(struct task_struct *p, const struct cpumask *new_mask, u32 flags); ++ ++static inline struct task_struct *get_push_task(struct rq *rq) ++{ ++ struct task_struct *p = rq->curr; ++ ++ lockdep_assert_held(&rq->lock); ++ ++ if (rq->push_busy) ++ return NULL; ++ ++ if (p->nr_cpus_allowed == 1) ++ return NULL; ++ ++ if (p->migration_disabled) ++ return NULL; ++ ++ rq->push_busy = true; ++ return get_task_struct(p); ++} ++ ++extern int push_cpu_stop(void *arg); + + #endif + +@@ -2007,6 +2065,15 @@ extern void reweight_task(struct task_struct *p, int prio); + extern void resched_curr(struct rq *rq); + extern void resched_cpu(int cpu); + ++#ifdef CONFIG_PREEMPT_LAZY ++extern void resched_curr_lazy(struct rq *rq); ++#else ++static inline void resched_curr_lazy(struct rq *rq) ++{ ++ resched_curr(rq); ++} ++#endif ++ + extern struct rt_bandwidth def_rt_bandwidth; + extern void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime); + +diff --git a/kernel/sched/swait.c b/kernel/sched/swait.c +index e1c655f92..f230b1ac7 100644 +--- a/kernel/sched/swait.c ++++ b/kernel/sched/swait.c +@@ -64,6 +64,7 @@ void swake_up_all(struct swait_queue_head *q) + struct swait_queue *curr; + LIST_HEAD(tmp); + ++ WARN_ON(irqs_disabled()); + raw_spin_lock_irq(&q->lock); + list_splice_init(&q->task_list, &tmp); + while (!list_empty(&tmp)) { +diff --git a/kernel/signal.c b/kernel/signal.c +index 54f86e0b9..28d34857e 100644 +--- a/kernel/signal.c ++++ b/kernel/signal.c +@@ -20,6 +20,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -406,13 +407,30 @@ void task_join_group_stop(struct task_struct *task) + task_set_jobctl_pending(task, mask | JOBCTL_STOP_PENDING); + } + ++static inline struct sigqueue *get_task_cache(struct task_struct *t) ++{ ++ struct sigqueue *q = t->sigqueue_cache; ++ ++ if (cmpxchg(&t->sigqueue_cache, q, NULL) != q) ++ return NULL; ++ return q; ++} ++ ++static inline int put_task_cache(struct task_struct *t, struct sigqueue *q) ++{ ++ if (cmpxchg(&t->sigqueue_cache, NULL, q) == NULL) ++ return 0; ++ return 1; ++} ++ + /* + * allocate a new signal queue record + * - this may be called without locks if and only if t == current, otherwise an + * appropriate lock must be held to stop the target task from exiting + */ + static struct sigqueue * +-__sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimit) ++__sigqueue_do_alloc(int sig, struct task_struct *t, gfp_t flags, ++ int override_rlimit, int fromslab) + { + struct sigqueue *q = NULL; + struct user_struct *user; +@@ -434,7 +452,10 @@ __sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimi + rcu_read_unlock(); + + if (override_rlimit || likely(sigpending <= task_rlimit(t, RLIMIT_SIGPENDING))) { +- q = kmem_cache_alloc(sigqueue_cachep, flags); ++ if (!fromslab) ++ q = get_task_cache(t); ++ if (!q) ++ q = kmem_cache_alloc(sigqueue_cachep, flags); + } else { + print_dropped_signal(sig); + } +@@ -451,6 +472,13 @@ __sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimi + return q; + } + ++static struct sigqueue * ++__sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, ++ int override_rlimit) ++{ ++ return __sigqueue_do_alloc(sig, t, flags, override_rlimit, 0); ++} ++ + static void __sigqueue_free(struct sigqueue *q) + { + if (q->flags & SIGQUEUE_PREALLOC) +@@ -460,6 +488,21 @@ static void __sigqueue_free(struct sigqueue *q) + kmem_cache_free(sigqueue_cachep, q); + } + ++static void sigqueue_free_current(struct sigqueue *q) ++{ ++ struct user_struct *up; ++ ++ if (q->flags & SIGQUEUE_PREALLOC) ++ return; ++ ++ up = q->user; ++ if (rt_prio(current->normal_prio) && !put_task_cache(current, q)) { ++ if (atomic_dec_and_test(&up->sigpending)) ++ free_uid(up); ++ } else ++ __sigqueue_free(q); ++} ++ + void flush_sigqueue(struct sigpending *queue) + { + struct sigqueue *q; +@@ -472,6 +515,21 @@ void flush_sigqueue(struct sigpending *queue) + } + } + ++/* ++ * Called from __exit_signal. Flush tsk->pending and ++ * tsk->sigqueue_cache ++ */ ++void flush_task_sigqueue(struct task_struct *tsk) ++{ ++ struct sigqueue *q; ++ ++ flush_sigqueue(&tsk->pending); ++ ++ q = get_task_cache(tsk); ++ if (q) ++ kmem_cache_free(sigqueue_cachep, q); ++} ++ + /* + * Flush all pending signals for this kthread. + */ +@@ -596,7 +654,7 @@ static void collect_signal(int sig, struct sigpending *list, kernel_siginfo_t *i + (info->si_code == SI_TIMER) && + (info->si_sys_private); + +- __sigqueue_free(first); ++ sigqueue_free_current(first); + } else { + /* + * Ok, it wasn't in the queue. This must be +@@ -633,6 +691,8 @@ int dequeue_signal(struct task_struct *tsk, sigset_t *mask, kernel_siginfo_t *in + bool resched_timer = false; + int signr; + ++ WARN_ON_ONCE(tsk != current); ++ + /* We only dequeue private signals from ourselves, we don't let + * signalfd steal them + */ +@@ -1319,6 +1379,34 @@ force_sig_info_to_task(struct kernel_siginfo *info, struct task_struct *t) + struct k_sigaction *action; + int sig = info->si_signo; + ++ /* ++ * On some archs, PREEMPT_RT has to delay sending a signal from a trap ++ * since it can not enable preemption, and the signal code's spin_locks ++ * turn into mutexes. Instead, it must set TIF_NOTIFY_RESUME which will ++ * send the signal on exit of the trap. ++ */ ++#ifdef ARCH_RT_DELAYS_SIGNAL_SEND ++ if (in_atomic()) { ++ struct task_struct *t = current; ++ ++ if (WARN_ON_ONCE(t->forced_info.si_signo)) ++ return 0; ++ ++ if (is_si_special(info)) { ++ WARN_ON_ONCE(info != SEND_SIG_PRIV); ++ t->forced_info.si_signo = info->si_signo; ++ t->forced_info.si_errno = 0; ++ t->forced_info.si_code = SI_KERNEL; ++ t->forced_info.si_pid = 0; ++ t->forced_info.si_uid = 0; ++ } else { ++ t->forced_info = *info; ++ } ++ ++ set_tsk_thread_flag(t, TIF_NOTIFY_RESUME); ++ return 0; ++ } ++#endif + spin_lock_irqsave(&t->sighand->siglock, flags); + action = &t->sighand->action[sig-1]; + ignored = action->sa.sa_handler == SIG_IGN; +@@ -1812,7 +1900,8 @@ EXPORT_SYMBOL(kill_pid); + */ + struct sigqueue *sigqueue_alloc(void) + { +- struct sigqueue *q = __sigqueue_alloc(-1, current, GFP_KERNEL, 0); ++ /* Preallocated sigqueue objects always from the slabcache ! */ ++ struct sigqueue *q = __sigqueue_do_alloc(-1, current, GFP_KERNEL, 0, 1); + + if (q) + q->flags |= SIGQUEUE_PREALLOC; +@@ -2198,16 +2287,8 @@ static void ptrace_stop(int exit_code, int why, int clear_code, kernel_siginfo_t + if (gstop_done && ptrace_reparented(current)) + do_notify_parent_cldstop(current, false, why); + +- /* +- * Don't want to allow preemption here, because +- * sys_ptrace() needs this task to be inactive. +- * +- * XXX: implement read_unlock_no_resched(). +- */ +- preempt_disable(); + read_unlock(&tasklist_lock); + cgroup_enter_frozen(); +- preempt_enable_no_resched(); + freezable_schedule(); + cgroup_leave_frozen(true); + } else { +diff --git a/kernel/smp.c b/kernel/smp.c +index b04ab01eb..31269d781 100644 +--- a/kernel/smp.c ++++ b/kernel/smp.c +@@ -480,8 +480,18 @@ void flush_smp_call_function_from_idle(void) + + local_irq_save(flags); + flush_smp_call_function_queue(true); +- if (local_softirq_pending()) +- do_softirq(); ++ ++ if (local_softirq_pending()) { ++ ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT)) { ++ do_softirq(); ++ } else { ++ struct task_struct *ksoftirqd = this_cpu_ksoftirqd(); ++ ++ if (ksoftirqd && ksoftirqd->state != TASK_RUNNING) ++ wake_up_process(ksoftirqd); ++ } ++ } + + local_irq_restore(flags); + } +diff --git a/kernel/softirq.c b/kernel/softirq.c +index 09229ad82..c9adc5c46 100644 +--- a/kernel/softirq.c ++++ b/kernel/softirq.c +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -25,6 +26,7 @@ + #include + #include + #include ++#include + + #define CREATE_TRACE_POINTS + #include +@@ -92,27 +94,212 @@ static bool ksoftirqd_running(unsigned long pending) + !__kthread_should_park(tsk); + } + ++#ifdef CONFIG_TRACE_IRQFLAGS ++DEFINE_PER_CPU(int, hardirqs_enabled); ++DEFINE_PER_CPU(int, hardirq_context); ++EXPORT_PER_CPU_SYMBOL_GPL(hardirqs_enabled); ++EXPORT_PER_CPU_SYMBOL_GPL(hardirq_context); ++#endif ++ + /* +- * preempt_count and SOFTIRQ_OFFSET usage: +- * - preempt_count is changed by SOFTIRQ_OFFSET on entering or leaving +- * softirq processing. +- * - preempt_count is changed by SOFTIRQ_DISABLE_OFFSET (= 2 * SOFTIRQ_OFFSET) ++ * SOFTIRQ_OFFSET usage: ++ * ++ * On !RT kernels 'count' is the preempt counter, on RT kernels this applies ++ * to a per CPU counter and to task::softirqs_disabled_cnt. ++ * ++ * - count is changed by SOFTIRQ_OFFSET on entering or leaving softirq ++ * processing. ++ * ++ * - count is changed by SOFTIRQ_DISABLE_OFFSET (= 2 * SOFTIRQ_OFFSET) + * on local_bh_disable or local_bh_enable. ++ * + * This lets us distinguish between whether we are currently processing + * softirq and whether we just have bh disabled. + */ ++#ifdef CONFIG_PREEMPT_RT + + /* +- * This one is for softirq.c-internal use, +- * where hardirqs are disabled legitimately: ++ * RT accounts for BH disabled sections in task::softirqs_disabled_cnt and ++ * also in per CPU softirq_ctrl::cnt. This is necessary to allow tasks in a ++ * softirq disabled section to be preempted. ++ * ++ * The per task counter is used for softirq_count(), in_softirq() and ++ * in_serving_softirqs() because these counts are only valid when the task ++ * holding softirq_ctrl::lock is running. ++ * ++ * The per CPU counter prevents pointless wakeups of ksoftirqd in case that ++ * the task which is in a softirq disabled section is preempted or blocks. + */ +-#ifdef CONFIG_TRACE_IRQFLAGS ++struct softirq_ctrl { ++ local_lock_t lock; ++ int cnt; ++}; + +-DEFINE_PER_CPU(int, hardirqs_enabled); +-DEFINE_PER_CPU(int, hardirq_context); +-EXPORT_PER_CPU_SYMBOL_GPL(hardirqs_enabled); +-EXPORT_PER_CPU_SYMBOL_GPL(hardirq_context); ++static DEFINE_PER_CPU(struct softirq_ctrl, softirq_ctrl) = { ++ .lock = INIT_LOCAL_LOCK(softirq_ctrl.lock), ++}; ++ ++/** ++ * local_bh_blocked() - Check for idle whether BH processing is blocked ++ * ++ * Returns false if the per CPU softirq::cnt is 0 otherwise true. ++ * ++ * This is invoked from the idle task to guard against false positive ++ * softirq pending warnings, which would happen when the task which holds ++ * softirq_ctrl::lock was the only running task on the CPU and blocks on ++ * some other lock. ++ */ ++bool local_bh_blocked(void) ++{ ++ return __this_cpu_read(softirq_ctrl.cnt) != 0; ++} ++ ++void __local_bh_disable_ip(unsigned long ip, unsigned int cnt) ++{ ++ unsigned long flags; ++ int newcnt; ++ ++ WARN_ON_ONCE(in_hardirq()); ++ ++ /* First entry of a task into a BH disabled section? */ ++ if (!current->softirq_disable_cnt) { ++ if (preemptible()) { ++ local_lock(&softirq_ctrl.lock); ++ /* Required to meet the RCU bottomhalf requirements. */ ++ rcu_read_lock(); ++ } else { ++ DEBUG_LOCKS_WARN_ON(this_cpu_read(softirq_ctrl.cnt)); ++ } ++ } ++ ++ /* ++ * Track the per CPU softirq disabled state. On RT this is per CPU ++ * state to allow preemption of bottom half disabled sections. ++ */ ++ newcnt = __this_cpu_add_return(softirq_ctrl.cnt, cnt); ++ /* ++ * Reflect the result in the task state to prevent recursion on the ++ * local lock and to make softirq_count() & al work. ++ */ ++ current->softirq_disable_cnt = newcnt; ++ ++ if (IS_ENABLED(CONFIG_TRACE_IRQFLAGS) && newcnt == cnt) { ++ raw_local_irq_save(flags); ++ lockdep_softirqs_off(ip); ++ raw_local_irq_restore(flags); ++ } ++} ++EXPORT_SYMBOL(__local_bh_disable_ip); ++ ++static void __local_bh_enable(unsigned int cnt, bool unlock) ++{ ++ unsigned long flags; ++ int newcnt; ++ ++ DEBUG_LOCKS_WARN_ON(current->softirq_disable_cnt != ++ this_cpu_read(softirq_ctrl.cnt)); ++ ++ if (IS_ENABLED(CONFIG_TRACE_IRQFLAGS) && softirq_count() == cnt) { ++ raw_local_irq_save(flags); ++ lockdep_softirqs_on(_RET_IP_); ++ raw_local_irq_restore(flags); ++ } ++ ++ newcnt = __this_cpu_sub_return(softirq_ctrl.cnt, cnt); ++ current->softirq_disable_cnt = newcnt; ++ ++ if (!newcnt && unlock) { ++ rcu_read_unlock(); ++ local_unlock(&softirq_ctrl.lock); ++ } ++} ++ ++void __local_bh_enable_ip(unsigned long ip, unsigned int cnt) ++{ ++ bool preempt_on = preemptible(); ++ unsigned long flags; ++ u32 pending; ++ int curcnt; ++ ++ WARN_ON_ONCE(in_irq()); ++ lockdep_assert_irqs_enabled(); ++ ++ local_irq_save(flags); ++ curcnt = __this_cpu_read(softirq_ctrl.cnt); ++ ++ /* ++ * If this is not reenabling soft interrupts, no point in trying to ++ * run pending ones. ++ */ ++ if (curcnt != cnt) ++ goto out; ++ ++ pending = local_softirq_pending(); ++ if (!pending || ksoftirqd_running(pending)) ++ goto out; ++ ++ /* ++ * If this was called from non preemptible context, wake up the ++ * softirq daemon. ++ */ ++ if (!preempt_on) { ++ wakeup_softirqd(); ++ goto out; ++ } ++ ++ /* ++ * Adjust softirq count to SOFTIRQ_OFFSET which makes ++ * in_serving_softirq() become true. ++ */ ++ cnt = SOFTIRQ_OFFSET; ++ __local_bh_enable(cnt, false); ++ __do_softirq(); ++ ++out: ++ __local_bh_enable(cnt, preempt_on); ++ local_irq_restore(flags); ++} ++EXPORT_SYMBOL(__local_bh_enable_ip); ++ ++/* ++ * Invoked from ksoftirqd_run() outside of the interrupt disabled section ++ * to acquire the per CPU local lock for reentrancy protection. ++ */ ++static inline void ksoftirqd_run_begin(void) ++{ ++ __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET); ++ local_irq_disable(); ++} ++ ++/* Counterpart to ksoftirqd_run_begin() */ ++static inline void ksoftirqd_run_end(void) ++{ ++ __local_bh_enable(SOFTIRQ_OFFSET, true); ++ WARN_ON_ONCE(in_interrupt()); ++ local_irq_enable(); ++} ++ ++static inline void softirq_handle_begin(void) { } ++static inline void softirq_handle_end(void) { } + ++static inline bool should_wake_ksoftirqd(void) ++{ ++ return !this_cpu_read(softirq_ctrl.cnt); ++} ++ ++static inline void invoke_softirq(void) ++{ ++ if (should_wake_ksoftirqd()) ++ wakeup_softirqd(); ++} ++ ++#else /* CONFIG_PREEMPT_RT */ ++ ++/* ++ * This one is for softirq.c-internal use, where hardirqs are disabled ++ * legitimately: ++ */ ++#ifdef CONFIG_TRACE_IRQFLAGS + void __local_bh_disable_ip(unsigned long ip, unsigned int cnt) + { + unsigned long flags; +@@ -203,6 +390,78 @@ void __local_bh_enable_ip(unsigned long ip, unsigned int cnt) + } + EXPORT_SYMBOL(__local_bh_enable_ip); + ++static inline void softirq_handle_begin(void) ++{ ++ __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET); ++} ++ ++static inline void softirq_handle_end(void) ++{ ++ __local_bh_enable(SOFTIRQ_OFFSET); ++ WARN_ON_ONCE(in_interrupt()); ++} ++ ++static inline void ksoftirqd_run_begin(void) ++{ ++ local_irq_disable(); ++} ++ ++static inline void ksoftirqd_run_end(void) ++{ ++ local_irq_enable(); ++} ++ ++static inline bool should_wake_ksoftirqd(void) ++{ ++ return true; ++} ++ ++static inline void invoke_softirq(void) ++{ ++ if (ksoftirqd_running(local_softirq_pending())) ++ return; ++ ++ if (!force_irqthreads) { ++#ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK ++ /* ++ * We can safely execute softirq on the current stack if ++ * it is the irq stack, because it should be near empty ++ * at this stage. ++ */ ++ __do_softirq(); ++#else ++ /* ++ * Otherwise, irq_exit() is called on the task stack that can ++ * be potentially deep already. So call softirq in its own stack ++ * to prevent from any overrun. ++ */ ++ do_softirq_own_stack(); ++#endif ++ } else { ++ wakeup_softirqd(); ++ } ++} ++ ++asmlinkage __visible void do_softirq(void) ++{ ++ __u32 pending; ++ unsigned long flags; ++ ++ if (in_interrupt()) ++ return; ++ ++ local_irq_save(flags); ++ ++ pending = local_softirq_pending(); ++ ++ if (pending && !ksoftirqd_running(pending)) ++ do_softirq_own_stack(); ++ ++ local_irq_restore(flags); ++} ++ ++#endif /* !CONFIG_PREEMPT_RT */ ++ + /* + * We restart softirq processing for at most MAX_SOFTIRQ_RESTART times, + * but break the loop if need_resched() is set or after 2 ms. +@@ -270,10 +529,10 @@ asmlinkage __visible void __softirq_entry __do_softirq(void) + current->flags &= ~PF_MEMALLOC; + + pending = local_softirq_pending(); +- account_irq_enter_time(current); + +- __local_bh_disable_ip(_RET_IP_, SOFTIRQ_OFFSET); ++ softirq_handle_begin(); + in_hardirq = lockdep_softirq_start(); ++ account_softirq_enter(current); + + restart: + /* Reset the pending bitmask before enabling irqs */ +@@ -307,8 +566,10 @@ asmlinkage __visible void __softirq_entry __do_softirq(void) + pending >>= softirq_bit; + } + +- if (__this_cpu_read(ksoftirqd) == current) ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT) && ++ __this_cpu_read(ksoftirqd) == current) + rcu_softirq_qs(); ++ + local_irq_disable(); + + pending = local_softirq_pending(); +@@ -320,46 +581,23 @@ asmlinkage __visible void __softirq_entry __do_softirq(void) + wakeup_softirqd(); + } + ++ account_softirq_exit(current); + lockdep_softirq_end(in_hardirq); +- account_irq_exit_time(current); +- __local_bh_enable(SOFTIRQ_OFFSET); +- WARN_ON_ONCE(in_interrupt()); ++ softirq_handle_end(); + current_restore_flags(old_flags, PF_MEMALLOC); + } + +-asmlinkage __visible void do_softirq(void) +-{ +- __u32 pending; +- unsigned long flags; +- +- if (in_interrupt()) +- return; +- +- local_irq_save(flags); +- +- pending = local_softirq_pending(); +- +- if (pending && !ksoftirqd_running(pending)) +- do_softirq_own_stack(); +- +- local_irq_restore(flags); +-} +- + /** + * irq_enter_rcu - Enter an interrupt context with RCU watching + */ + void irq_enter_rcu(void) + { +- if (is_idle_task(current) && !in_interrupt()) { +- /* +- * Prevent raise_softirq from needlessly waking up ksoftirqd +- * here, as softirq will be serviced on return from interrupt. +- */ +- local_bh_disable(); ++ __irq_enter_raw(); ++ ++ if (is_idle_task(current) && (irq_count() == HARDIRQ_OFFSET)) + tick_irq_enter(); +- _local_bh_enable(); +- } +- __irq_enter(); ++ ++ account_hardirq_enter(current); + } + + /** +@@ -371,32 +609,6 @@ void irq_enter(void) + irq_enter_rcu(); + } + +-static inline void invoke_softirq(void) +-{ +- if (ksoftirqd_running(local_softirq_pending())) +- return; +- +- if (!force_irqthreads) { +-#ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK +- /* +- * We can safely execute softirq on the current stack if +- * it is the irq stack, because it should be near empty +- * at this stage. +- */ +- __do_softirq(); +-#else +- /* +- * Otherwise, irq_exit() is called on the task stack that can +- * be potentially deep already. So call softirq in its own stack +- * to prevent from any overrun. +- */ +- do_softirq_own_stack(); +-#endif +- } else { +- wakeup_softirqd(); +- } +-} +- + static inline void tick_irq_exit(void) + { + #ifdef CONFIG_NO_HZ_COMMON +@@ -417,7 +629,7 @@ static inline void __irq_exit_rcu(void) + #else + lockdep_assert_irqs_disabled(); + #endif +- account_irq_exit_time(current); ++ account_hardirq_exit(current); + preempt_count_sub(HARDIRQ_OFFSET); + if (!in_interrupt() && local_softirq_pending()) + invoke_softirq(); +@@ -466,7 +678,7 @@ inline void raise_softirq_irqoff(unsigned int nr) + * Otherwise we wake up ksoftirqd to make sure we + * schedule the softirq soon. + */ +- if (!in_interrupt()) ++ if (!in_interrupt() && should_wake_ksoftirqd()) + wakeup_softirqd(); + } + +@@ -532,6 +744,16 @@ void __tasklet_hi_schedule(struct tasklet_struct *t) + } + EXPORT_SYMBOL(__tasklet_hi_schedule); + ++static inline bool tasklet_clear_sched(struct tasklet_struct *t) ++{ ++ if (test_and_clear_bit(TASKLET_STATE_SCHED, &t->state)) { ++ wake_up_var(&t->state); ++ return true; ++ } ++ ++ return false; ++} ++ + static void tasklet_action_common(struct softirq_action *a, + struct tasklet_head *tl_head, + unsigned int softirq_nr) +@@ -551,8 +773,7 @@ static void tasklet_action_common(struct softirq_action *a, + + if (tasklet_trylock(t)) { + if (!atomic_read(&t->count)) { +- if (!test_and_clear_bit(TASKLET_STATE_SCHED, +- &t->state)) ++ if (!tasklet_clear_sched(t)) + BUG(); + if (t->use_callback) + t->callback(t); +@@ -607,21 +828,62 @@ void tasklet_init(struct tasklet_struct *t, + } + EXPORT_SYMBOL(tasklet_init); + ++#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT) ++/* ++ * Do not use in new code. Waiting for tasklets from atomic contexts is ++ * error prone and should be avoided. ++ */ ++void tasklet_unlock_spin_wait(struct tasklet_struct *t) ++{ ++ while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { ++ if (IS_ENABLED(CONFIG_PREEMPT_RT)) { ++ /* ++ * Prevent a live lock when current preempted soft ++ * interrupt processing or prevents ksoftirqd from ++ * running. If the tasklet runs on a different CPU ++ * then this has no effect other than doing the BH ++ * disable/enable dance for nothing. ++ */ ++ local_bh_disable(); ++ local_bh_enable(); ++ } else { ++ cpu_relax(); ++ } ++ } ++} ++EXPORT_SYMBOL(tasklet_unlock_spin_wait); ++#endif ++ + void tasklet_kill(struct tasklet_struct *t) + { + if (in_interrupt()) + pr_notice("Attempt to kill tasklet from interrupt\n"); + +- while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) { +- do { +- yield(); +- } while (test_bit(TASKLET_STATE_SCHED, &t->state)); +- } ++ while (test_and_set_bit(TASKLET_STATE_SCHED, &t->state)) ++ wait_var_event(&t->state, !test_bit(TASKLET_STATE_SCHED, &t->state)); ++ + tasklet_unlock_wait(t); +- clear_bit(TASKLET_STATE_SCHED, &t->state); ++ tasklet_clear_sched(t); + } + EXPORT_SYMBOL(tasklet_kill); + ++#if defined(CONFIG_SMP) || defined(CONFIG_PREEMPT_RT) ++void tasklet_unlock(struct tasklet_struct *t) ++{ ++ smp_mb__before_atomic(); ++ clear_bit(TASKLET_STATE_RUN, &t->state); ++ smp_mb__after_atomic(); ++ wake_up_var(&t->state); ++} ++EXPORT_SYMBOL_GPL(tasklet_unlock); ++ ++void tasklet_unlock_wait(struct tasklet_struct *t) ++{ ++ wait_var_event(&t->state, !test_bit(TASKLET_STATE_RUN, &t->state)); ++} ++EXPORT_SYMBOL_GPL(tasklet_unlock_wait); ++#endif ++ + void __init softirq_init(void) + { + int cpu; +@@ -644,18 +906,18 @@ static int ksoftirqd_should_run(unsigned int cpu) + + static void run_ksoftirqd(unsigned int cpu) + { +- local_irq_disable(); ++ ksoftirqd_run_begin(); + if (local_softirq_pending()) { + /* + * We can safely run softirq on inline stack, as we are not deep + * in the task stack here. + */ + __do_softirq(); +- local_irq_enable(); ++ ksoftirqd_run_end(); + cond_resched(); + return; + } +- local_irq_enable(); ++ ksoftirqd_run_end(); + } + + #ifdef CONFIG_HOTPLUG_CPU +diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c +index dd5aeddbe..8bf1fb832 100644 +--- a/kernel/stop_machine.c ++++ b/kernel/stop_machine.c +@@ -47,11 +47,27 @@ struct cpu_stopper { + struct list_head works; /* list of pending works */ + + struct cpu_stop_work stop_work; /* for stop_cpus */ ++ unsigned long caller; ++ cpu_stop_fn_t fn; + }; + + static DEFINE_PER_CPU(struct cpu_stopper, cpu_stopper); + static bool stop_machine_initialized = false; + ++void print_stop_info(const char *log_lvl, struct task_struct *task) ++{ ++ /* ++ * If @task is a stopper task, it cannot migrate and task_cpu() is ++ * stable. ++ */ ++ struct cpu_stopper *stopper = per_cpu_ptr(&cpu_stopper, task_cpu(task)); ++ ++ if (task != stopper->thread) ++ return; ++ ++ printk("%sStopper: %pS <- %pS\n", log_lvl, stopper->fn, (void *)stopper->caller); ++} ++ + /* static data for stop_cpus */ + static DEFINE_MUTEX(stop_cpus_mutex); + static bool stop_cpus_in_progress; +@@ -128,7 +144,7 @@ static bool cpu_stop_queue_work(unsigned int cpu, struct cpu_stop_work *work) + int stop_one_cpu(unsigned int cpu, cpu_stop_fn_t fn, void *arg) + { + struct cpu_stop_done done; +- struct cpu_stop_work work = { .fn = fn, .arg = arg, .done = &done }; ++ struct cpu_stop_work work = { .fn = fn, .arg = arg, .done = &done, .caller = _RET_IP_ }; + + cpu_stop_init_done(&done, 1); + if (!cpu_stop_queue_work(cpu, &work)) +@@ -344,7 +360,8 @@ int stop_two_cpus(unsigned int cpu1, unsigned int cpu2, cpu_stop_fn_t fn, void * + work1 = work2 = (struct cpu_stop_work){ + .fn = multi_cpu_stop, + .arg = &msdata, +- .done = &done ++ .done = &done, ++ .caller = _RET_IP_, + }; + + cpu_stop_init_done(&done, 2); +@@ -380,7 +397,7 @@ int stop_two_cpus(unsigned int cpu1, unsigned int cpu2, cpu_stop_fn_t fn, void * + bool stop_one_cpu_nowait(unsigned int cpu, cpu_stop_fn_t fn, void *arg, + struct cpu_stop_work *work_buf) + { +- *work_buf = (struct cpu_stop_work){ .fn = fn, .arg = arg, }; ++ *work_buf = (struct cpu_stop_work){ .fn = fn, .arg = arg, .caller = _RET_IP_, }; + return cpu_stop_queue_work(cpu, work_buf); + } + +@@ -500,6 +517,8 @@ static void cpu_stopper_thread(unsigned int cpu) + int ret; + + /* cpu stop callbacks must not sleep, make in_atomic() == T */ ++ stopper->caller = work->caller; ++ stopper->fn = fn; + preempt_count_inc(); + ret = fn(arg); + if (done) { +@@ -508,6 +527,8 @@ static void cpu_stopper_thread(unsigned int cpu) + cpu_stop_signal_done(done); + } + preempt_count_dec(); ++ stopper->fn = NULL; ++ stopper->caller = 0; + WARN_ONCE(preempt_count(), + "cpu_stop: %ps(%p) leaked preempt count\n", fn, arg); + goto repeat; +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index 4ef90718c..6eb443234 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -2052,6 +2052,36 @@ SYSCALL_DEFINE2(nanosleep_time32, struct old_timespec32 __user *, rqtp, + } + #endif + ++#ifdef CONFIG_PREEMPT_RT ++/* ++ * Sleep for 1 ms in hope whoever holds what we want will let it go. ++ */ ++void cpu_chill(void) ++{ ++ unsigned int freeze_flag = current->flags & PF_NOFREEZE; ++ struct task_struct *self = current; ++ ktime_t chill_time; ++ ++ raw_spin_lock_irq(&self->pi_lock); ++ self->saved_state = self->state; ++ __set_current_state_no_track(TASK_UNINTERRUPTIBLE); ++ raw_spin_unlock_irq(&self->pi_lock); ++ ++ chill_time = ktime_set(0, NSEC_PER_MSEC); ++ ++ current->flags |= PF_NOFREEZE; ++ schedule_hrtimeout(&chill_time, HRTIMER_MODE_REL_HARD); ++ if (!freeze_flag) ++ current->flags &= ~PF_NOFREEZE; ++ ++ raw_spin_lock_irq(&self->pi_lock); ++ __set_current_state_no_track(self->saved_state); ++ self->saved_state = TASK_RUNNING; ++ raw_spin_unlock_irq(&self->pi_lock); ++} ++EXPORT_SYMBOL(cpu_chill); ++#endif ++ + /* + * Functions related to boot-time initialization: + */ +diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c +index 2d7899700..e4e09ad9e 100644 +--- a/kernel/time/tick-sched.c ++++ b/kernel/time/tick-sched.c +@@ -990,7 +990,7 @@ static bool can_stop_idle_tick(int cpu, struct tick_sched *ts) + if (unlikely(local_softirq_pending())) { + static int ratelimit; + +- if (ratelimit < 10 && ++ if (ratelimit < 10 && !local_bh_blocked() && + (local_softirq_pending() & SOFTIRQ_STOP_IDLE_MASK)) { + pr_warn("NOHZ tick-stop error: Non-RCU local softirq work is pending, handler #%02x!!!\n", + (unsigned int) local_softirq_pending()); +diff --git a/kernel/time/timer.c b/kernel/time/timer.c +index 351420c23..2a9e0b89d 100644 +--- a/kernel/time/timer.c ++++ b/kernel/time/timer.c +@@ -1287,7 +1287,7 @@ static void del_timer_wait_running(struct timer_list *timer) + u32 tf; + + tf = READ_ONCE(timer->flags); +- if (!(tf & TIMER_MIGRATING)) { ++ if (!(tf & (TIMER_MIGRATING | TIMER_IRQSAFE))) { + struct timer_base *base = get_timer_base(tf); + + /* +@@ -1371,6 +1371,13 @@ int del_timer_sync(struct timer_list *timer) + */ + WARN_ON(in_irq() && !(timer->flags & TIMER_IRQSAFE)); + ++ /* ++ * Must be able to sleep on PREEMPT_RT because of the slowpath in ++ * del_timer_wait_running(). ++ */ ++ if (IS_ENABLED(CONFIG_PREEMPT_RT) && !(timer->flags & TIMER_IRQSAFE)) ++ lockdep_assert_preemption_enabled(); ++ + do { + ret = try_to_del_timer_sync(timer); + +diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c +index aced2292d..5bcf53436 100644 +--- a/kernel/trace/trace.c ++++ b/kernel/trace/trace.c +@@ -2586,60 +2586,43 @@ enum print_line_t trace_handle_return(struct trace_seq *s) + } + EXPORT_SYMBOL_GPL(trace_handle_return); + +-unsigned int tracing_gen_ctx_flags(unsigned long irqflags) ++static unsigned short migration_disable_value(void) + { +- unsigned int trace_flags = 0; ++#if defined(CONFIG_SMP) && defined(CONFIG_PREEMPT_RT) ++ return current->migration_disabled; ++#else ++ return 0; ++#endif ++} ++ ++unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status) ++{ ++ unsigned int trace_flags = irqs_status; + unsigned int pc; + + pc = preempt_count(); + +-#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT +- if (irqs_disabled_flags(irqflags)) +- trace_flags |= TRACE_FLAG_IRQS_OFF; +-#else +- trace_flags |= TRACE_FLAG_IRQS_NOSUPPORT; +-#endif +- + if (pc & NMI_MASK) + trace_flags |= TRACE_FLAG_NMI; + if (pc & HARDIRQ_MASK) + trace_flags |= TRACE_FLAG_HARDIRQ; +- +- if (pc & SOFTIRQ_OFFSET) ++ if (in_serving_softirq()) + trace_flags |= TRACE_FLAG_SOFTIRQ; + + if (tif_need_resched()) + trace_flags |= TRACE_FLAG_NEED_RESCHED; + if (test_preempt_need_resched()) + trace_flags |= TRACE_FLAG_PREEMPT_RESCHED; +- return (trace_flags << 16) | (pc & 0xff); +-} + +-unsigned int tracing_gen_ctx(void) +-{ +- unsigned long irqflags; +- +-#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT +- local_save_flags(irqflags); +-#else +- irqflags = 0; ++#ifdef CONFIG_PREEMPT_LAZY ++ if (need_resched_lazy()) ++ trace_flags |= TRACE_FLAG_NEED_RESCHED_LAZY; + #endif +- return tracing_gen_ctx_flags(irqflags); +-} + +-unsigned int tracing_gen_ctx_dec(void) +-{ +- unsigned int trace_ctx; +- +- trace_ctx = tracing_gen_ctx(); +- +- /* +- * Subtract one from the preeption counter if preemption is enabled, +- * see trace_event_buffer_reserve()for details. +- */ +- if (IS_ENABLED(CONFIG_PREEMPTION)) +- trace_ctx--; +- return trace_ctx; ++ return (pc & 0xff) | ++ (migration_disable_value() & 0xff) << 8 | ++ (preempt_lazy_count() & 0xff) << 16 | ++ (trace_flags << 24); + } + + struct ring_buffer_event * +@@ -3835,14 +3818,17 @@ unsigned long trace_total_entries(struct trace_array *tr) + + static void print_lat_help_header(struct seq_file *m) + { +- seq_puts(m, "# _------=> CPU# \n" +- "# / _-----=> irqs-off \n" +- "# | / _----=> need-resched \n" +- "# || / _---=> hardirq/softirq \n" +- "# ||| / _--=> preempt-depth \n" +- "# |||| / delay \n" +- "# cmd pid ||||| time | caller \n" +- "# \\ / ||||| \\ | / \n"); ++ seq_puts(m, "# _--------=> CPU# \n" ++ "# / _-------=> irqs-off \n" ++ "# | / _------=> need-resched \n" ++ "# || / _-----=> need-resched-lazy\n" ++ "# ||| / _----=> hardirq/softirq \n" ++ "# |||| / _---=> preempt-depth \n" ++ "# ||||| / _--=> preempt-lazy-depth\n" ++ "# |||||| / _-=> migrate-disable \n" ++ "# ||||||| / delay \n" ++ "# cmd pid |||||||| time | caller \n" ++ "# \\ / |||||||| \\ | / \n"); + } + + static void print_event_info(struct array_buffer *buf, struct seq_file *m) +@@ -3876,13 +3862,16 @@ static void print_func_help_header_irq(struct array_buffer *buf, struct seq_file + + print_event_info(buf, m); + +- seq_printf(m, "# %.*s _-----=> irqs-off\n", prec, space); +- seq_printf(m, "# %.*s / _----=> need-resched\n", prec, space); +- seq_printf(m, "# %.*s| / _---=> hardirq/softirq\n", prec, space); +- seq_printf(m, "# %.*s|| / _--=> preempt-depth\n", prec, space); +- seq_printf(m, "# %.*s||| / delay\n", prec, space); +- seq_printf(m, "# TASK-PID %.*s CPU# |||| TIMESTAMP FUNCTION\n", prec, " TGID "); +- seq_printf(m, "# | | %.*s | |||| | |\n", prec, " | "); ++ seq_printf(m, "# %.*s _-------=> irqs-off\n", prec, space); ++ seq_printf(m, "# %.*s / _------=> need-resched\n", prec, space); ++ seq_printf(m, "# %.*s| / _-----=> need-resched-lazy\n", prec, space); ++ seq_printf(m, "# %.*s|| / _----=> hardirq/softirq\n", prec, space); ++ seq_printf(m, "# %.*s||| / _---=> preempt-depth\n", prec, space); ++ seq_printf(m, "# %.*s|||| / _--=> preempt-lazy-depth\n", prec, space); ++ seq_printf(m, "# %.*s||||| / _-=> migrate-disable\n", prec, space); ++ seq_printf(m, "# %.*s|||||| / delay\n", prec, space); ++ seq_printf(m, "# TASK-PID %.*s CPU# ||||||| TIMESTAMP FUNCTION\n", prec, " TGID "); ++ seq_printf(m, "# | | %.*s | ||||||| | |\n", prec, " | "); + } + + void +@@ -9417,7 +9406,6 @@ void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) + tracing_off(); + + local_irq_save(flags); +- printk_nmi_direct_enter(); + + /* Simulate the iterator */ + trace_init_global_iter(&iter); +@@ -9497,7 +9485,6 @@ void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) + atomic_dec(&per_cpu_ptr(iter.array_buffer->data, cpu)->disabled); + } + atomic_dec(&dump_running); +- printk_nmi_direct_exit(); + local_irq_restore(flags); + } + EXPORT_SYMBOL_GPL(ftrace_dump); +diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h +index c0596e250..44943a9be 100644 +--- a/kernel/trace/trace.h ++++ b/kernel/trace/trace.h +@@ -141,25 +141,6 @@ struct kretprobe_trace_entry_head { + unsigned long ret_ip; + }; + +-/* +- * trace_flag_type is an enumeration that holds different +- * states when a trace occurs. These are: +- * IRQS_OFF - interrupts were disabled +- * IRQS_NOSUPPORT - arch does not support irqs_disabled_flags +- * NEED_RESCHED - reschedule is requested +- * HARDIRQ - inside an interrupt handler +- * SOFTIRQ - inside a softirq handler +- */ +-enum trace_flag_type { +- TRACE_FLAG_IRQS_OFF = 0x01, +- TRACE_FLAG_IRQS_NOSUPPORT = 0x02, +- TRACE_FLAG_NEED_RESCHED = 0x04, +- TRACE_FLAG_HARDIRQ = 0x08, +- TRACE_FLAG_SOFTIRQ = 0x10, +- TRACE_FLAG_PREEMPT_RESCHED = 0x20, +- TRACE_FLAG_NMI = 0x40, +-}; +- + #define TRACE_BUF_SIZE 1024 + + struct trace_array; +diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c +index f4b11f609..a2abc0b40 100644 +--- a/kernel/trace/trace_events.c ++++ b/kernel/trace/trace_events.c +@@ -183,6 +183,8 @@ static int trace_define_common_fields(void) + __common_field(unsigned char, flags); + __common_field(unsigned char, preempt_count); + __common_field(int, pid); ++ __common_field(unsigned char, migrate_disable); ++ __common_field(unsigned char, preempt_lazy_count); + + return ret; + } +diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c +index 7042544c5..c711eb334 100644 +--- a/kernel/trace/trace_output.c ++++ b/kernel/trace/trace_output.c +@@ -441,6 +441,7 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) + { + char hardsoft_irq; + char need_resched; ++ char need_resched_lazy; + char irqs_off; + int hardirq; + int softirq; +@@ -471,6 +472,9 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) + break; + } + ++ need_resched_lazy = ++ (entry->flags & TRACE_FLAG_NEED_RESCHED_LAZY) ? 'L' : '.'; ++ + hardsoft_irq = + (nmi && hardirq) ? 'Z' : + nmi ? 'z' : +@@ -479,14 +483,25 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) + softirq ? 's' : + '.' ; + +- trace_seq_printf(s, "%c%c%c", +- irqs_off, need_resched, hardsoft_irq); ++ trace_seq_printf(s, "%c%c%c%c", ++ irqs_off, need_resched, need_resched_lazy, ++ hardsoft_irq); + + if (entry->preempt_count) + trace_seq_printf(s, "%x", entry->preempt_count); + else + trace_seq_putc(s, '.'); + ++ if (entry->preempt_lazy_count) ++ trace_seq_printf(s, "%x", entry->preempt_lazy_count); ++ else ++ trace_seq_putc(s, '.'); ++ ++ if (entry->migrate_disable) ++ trace_seq_printf(s, "%x", entry->migrate_disable); ++ else ++ trace_seq_putc(s, '.'); ++ + return !trace_seq_has_overflowed(s); + } + +diff --git a/kernel/workqueue.c b/kernel/workqueue.c +index 6bef482a1..855f2d8c9 100644 +--- a/kernel/workqueue.c ++++ b/kernel/workqueue.c +@@ -4933,6 +4933,10 @@ static void unbind_workers(int cpu) + pool->flags |= POOL_DISASSOCIATED; + + raw_spin_unlock_irq(&pool->lock); ++ ++ for_each_pool_worker(worker, pool) ++ WARN_ON_ONCE(set_cpus_allowed_ptr(worker->task, cpu_active_mask) < 0); ++ + mutex_unlock(&wq_pool_attach_mutex); + + /* +diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug +index f906df9db..c52d39d10 100644 +--- a/lib/Kconfig.debug ++++ b/lib/Kconfig.debug +@@ -1366,7 +1366,7 @@ config DEBUG_ATOMIC_SLEEP + + config DEBUG_LOCKING_API_SELFTESTS + bool "Locking API boot-time self-tests" +- depends on DEBUG_KERNEL ++ depends on DEBUG_KERNEL && !PREEMPT_RT + help + Say Y here if you want the kernel to run a short self-test during + bootup. The self-test checks whether common types of locking bugs +diff --git a/lib/bug.c b/lib/bug.c +index 4ab398a2d..9c681f29e 100644 +--- a/lib/bug.c ++++ b/lib/bug.c +@@ -202,6 +202,7 @@ enum bug_trap_type report_bug(unsigned long bugaddr, struct pt_regs *regs) + else + pr_crit("Kernel BUG at %pB [verbose debug info unavailable]\n", + (void *)bugaddr); ++ pr_flush(1000, true); + + return BUG_TRAP_TYPE_BUG; + } +diff --git a/lib/cpumask.c b/lib/cpumask.c +index fb22fb266..c3c76b833 100644 +--- a/lib/cpumask.c ++++ b/lib/cpumask.c +@@ -261,3 +261,21 @@ int cpumask_any_and_distribute(const struct cpumask *src1p, + return next; + } + EXPORT_SYMBOL(cpumask_any_and_distribute); ++ ++int cpumask_any_distribute(const struct cpumask *srcp) ++{ ++ int next, prev; ++ ++ /* NOTE: our first selection will skip 0. */ ++ prev = __this_cpu_read(distribute_cpu_mask_prev); ++ ++ next = cpumask_next(prev, srcp); ++ if (next >= nr_cpu_ids) ++ next = cpumask_first(srcp); ++ ++ if (next < nr_cpu_ids) ++ __this_cpu_write(distribute_cpu_mask_prev, next); ++ ++ return next; ++} ++EXPORT_SYMBOL(cpumask_any_distribute); +diff --git a/lib/debugobjects.c b/lib/debugobjects.c +index 9e14ae023..083882a3c 100644 +--- a/lib/debugobjects.c ++++ b/lib/debugobjects.c +@@ -557,7 +557,10 @@ __debug_object_init(void *addr, const struct debug_obj_descr *descr, int onstack + struct debug_obj *obj; + unsigned long flags; + +- fill_pool(); ++#ifdef CONFIG_PREEMPT_RT ++ if (preempt_count() == 0 && !irqs_disabled()) ++#endif ++ fill_pool(); + + db = get_bucket((unsigned long) addr); + +diff --git a/lib/dump_stack.c b/lib/dump_stack.c +index a00ee6eed..f5a33b6f7 100644 +--- a/lib/dump_stack.c ++++ b/lib/dump_stack.c +@@ -12,6 +12,7 @@ + #include + #include + #include ++#include + + static char dump_stack_arch_desc_str[128]; + +@@ -57,6 +58,7 @@ void dump_stack_print_info(const char *log_lvl) + log_lvl, dump_stack_arch_desc_str); + + print_worker_info(log_lvl, current); ++ print_stop_info(log_lvl, current); + } + + /** +diff --git a/lib/irq_poll.c b/lib/irq_poll.c +index 2f17b488d..7557bf7ec 100644 +--- a/lib/irq_poll.c ++++ b/lib/irq_poll.c +@@ -37,6 +37,7 @@ void irq_poll_sched(struct irq_poll *iop) + list_add_tail(&iop->list, this_cpu_ptr(&blk_cpu_iopoll)); + raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); + local_irq_restore(flags); ++ preempt_check_resched_rt(); + } + EXPORT_SYMBOL(irq_poll_sched); + +@@ -72,6 +73,7 @@ void irq_poll_complete(struct irq_poll *iop) + local_irq_save(flags); + __irq_poll_complete(iop); + local_irq_restore(flags); ++ preempt_check_resched_rt(); + } + EXPORT_SYMBOL(irq_poll_complete); + +@@ -96,6 +98,7 @@ static void __latent_entropy irq_poll_softirq(struct softirq_action *h) + } + + local_irq_enable(); ++ preempt_check_resched_rt(); + + /* Even though interrupts have been re-enabled, this + * access is safe because interrupts can only add new +@@ -133,6 +136,7 @@ static void __latent_entropy irq_poll_softirq(struct softirq_action *h) + __raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); + + local_irq_enable(); ++ preempt_check_resched_rt(); + } + + /** +@@ -196,6 +200,7 @@ static int irq_poll_cpu_dead(unsigned int cpu) + this_cpu_ptr(&blk_cpu_iopoll)); + __raise_softirq_irqoff(IRQ_POLL_SOFTIRQ); + local_irq_enable(); ++ preempt_check_resched_rt(); + + return 0; + } +diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c +index 76c52b0b7..98c376b02 100644 +--- a/lib/locking-selftest.c ++++ b/lib/locking-selftest.c +@@ -787,6 +787,8 @@ GENERATE_TESTCASE(init_held_rtmutex); + #include "locking-selftest-spin-hardirq.h" + GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_spin) + ++#ifndef CONFIG_PREEMPT_RT ++ + #include "locking-selftest-rlock-hardirq.h" + GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_hard_rlock) + +@@ -802,9 +804,12 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_rlock) + #include "locking-selftest-wlock-softirq.h" + GENERATE_PERMUTATIONS_2_EVENTS(irqsafe1_soft_wlock) + ++#endif ++ + #undef E1 + #undef E2 + ++#ifndef CONFIG_PREEMPT_RT + /* + * Enabling hardirqs with a softirq-safe lock held: + */ +@@ -837,6 +842,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A_rlock) + #undef E1 + #undef E2 + ++#endif ++ + /* + * Enabling irqs with an irq-safe lock held: + */ +@@ -860,6 +867,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2A_rlock) + #include "locking-selftest-spin-hardirq.h" + GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_spin) + ++#ifndef CONFIG_PREEMPT_RT ++ + #include "locking-selftest-rlock-hardirq.h" + GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_hard_rlock) + +@@ -875,6 +884,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_rlock) + #include "locking-selftest-wlock-softirq.h" + GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_wlock) + ++#endif ++ + #undef E1 + #undef E2 + +@@ -906,6 +917,8 @@ GENERATE_PERMUTATIONS_2_EVENTS(irqsafe2B_soft_wlock) + #include "locking-selftest-spin-hardirq.h" + GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_spin) + ++#ifndef CONFIG_PREEMPT_RT ++ + #include "locking-selftest-rlock-hardirq.h" + GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_hard_rlock) + +@@ -921,6 +934,8 @@ GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_rlock) + #include "locking-selftest-wlock-softirq.h" + GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_wlock) + ++#endif ++ + #undef E1 + #undef E2 + #undef E3 +@@ -954,6 +969,8 @@ GENERATE_PERMUTATIONS_3_EVENTS(irqsafe3_soft_wlock) + #include "locking-selftest-spin-hardirq.h" + GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_spin) + ++#ifndef CONFIG_PREEMPT_RT ++ + #include "locking-selftest-rlock-hardirq.h" + GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_hard_rlock) + +@@ -969,10 +986,14 @@ GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_rlock) + #include "locking-selftest-wlock-softirq.h" + GENERATE_PERMUTATIONS_3_EVENTS(irqsafe4_soft_wlock) + ++#endif ++ + #undef E1 + #undef E2 + #undef E3 + ++#ifndef CONFIG_PREEMPT_RT ++ + /* + * read-lock / write-lock irq inversion. + * +@@ -1162,6 +1183,11 @@ GENERATE_PERMUTATIONS_3_EVENTS(W1W2_R2R3_R3W1) + #undef E1 + #undef E2 + #undef E3 ++ ++#endif ++ ++#ifndef CONFIG_PREEMPT_RT ++ + /* + * read-lock / write-lock recursion that is actually safe. + */ +@@ -1208,6 +1234,8 @@ GENERATE_PERMUTATIONS_3_EVENTS(irq_read_recursion_soft_wlock) + #undef E2 + #undef E3 + ++#endif ++ + /* + * read-lock / write-lock recursion that is unsafe. + */ +@@ -2456,6 +2484,7 @@ void locking_selftest(void) + + printk(" --------------------------------------------------------------------------\n"); + ++#ifndef CONFIG_PREEMPT_RT + /* + * irq-context testcases: + */ +@@ -2470,6 +2499,28 @@ void locking_selftest(void) + DO_TESTCASE_6x2x2RW("irq read-recursion #2", irq_read_recursion2); + DO_TESTCASE_6x2x2RW("irq read-recursion #3", irq_read_recursion3); + ++#else ++ /* On -rt, we only do hardirq context test for raw spinlock */ ++ DO_TESTCASE_1B("hard-irqs-on + irq-safe-A", irqsafe1_hard_spin, 12); ++ DO_TESTCASE_1B("hard-irqs-on + irq-safe-A", irqsafe1_hard_spin, 21); ++ ++ DO_TESTCASE_1B("hard-safe-A + irqs-on", irqsafe2B_hard_spin, 12); ++ DO_TESTCASE_1B("hard-safe-A + irqs-on", irqsafe2B_hard_spin, 21); ++ ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 123); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 132); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 213); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 231); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 312); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #1", irqsafe3_hard_spin, 321); ++ ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 123); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 132); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 213); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 231); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 312); ++ DO_TESTCASE_1B("hard-safe-A + unsafe-B #2", irqsafe4_hard_spin, 321); ++#endif + ww_tests(); + + force_read_lock_recursive = 0; +diff --git a/lib/nmi_backtrace.c b/lib/nmi_backtrace.c +index 8abe1870d..b09a490f5 100644 +--- a/lib/nmi_backtrace.c ++++ b/lib/nmi_backtrace.c +@@ -75,12 +75,6 @@ void nmi_trigger_cpumask_backtrace(const cpumask_t *mask, + touch_softlockup_watchdog(); + } + +- /* +- * Force flush any remote buffers that might be stuck in IRQ context +- * and therefore could not run their irq_work. +- */ +- printk_safe_flush(); +- + clear_bit_unlock(0, &backtrace_flag); + put_cpu(); + } +diff --git a/lib/scatterlist.c b/lib/scatterlist.c +index a59778946..907f59045 100644 +--- a/lib/scatterlist.c ++++ b/lib/scatterlist.c +@@ -892,7 +892,7 @@ void sg_miter_stop(struct sg_mapping_iter *miter) + flush_kernel_dcache_page(miter->page); + + if (miter->__flags & SG_MITER_ATOMIC) { +- WARN_ON_ONCE(preemptible()); ++ WARN_ON_ONCE(!pagefault_disabled()); + kunmap_atomic(miter->addr); + } else + kunmap(miter->page); +diff --git a/lib/smp_processor_id.c b/lib/smp_processor_id.c +index 525222e4f..1c1dbd300 100644 +--- a/lib/smp_processor_id.c ++++ b/lib/smp_processor_id.c +@@ -26,6 +26,11 @@ unsigned int check_preemption_disabled(const char *what1, const char *what2) + if (current->nr_cpus_allowed == 1) + goto out; + ++#ifdef CONFIG_SMP ++ if (current->migration_disabled) ++ goto out; ++#endif ++ + /* + * It is valid to assume CPU-locality during early bootup: + */ +diff --git a/lib/test_lockup.c b/lib/test_lockup.c +index f1a020bcc..864554e76 100644 +--- a/lib/test_lockup.c ++++ b/lib/test_lockup.c +@@ -480,6 +480,21 @@ static int __init test_lockup_init(void) + return -EINVAL; + + #ifdef CONFIG_DEBUG_SPINLOCK ++#ifdef CONFIG_PREEMPT_RT ++ if (test_magic(lock_spinlock_ptr, ++ offsetof(spinlock_t, lock.wait_lock.magic), ++ SPINLOCK_MAGIC) || ++ test_magic(lock_rwlock_ptr, ++ offsetof(rwlock_t, rtmutex.wait_lock.magic), ++ SPINLOCK_MAGIC) || ++ test_magic(lock_mutex_ptr, ++ offsetof(struct mutex, lock.wait_lock.magic), ++ SPINLOCK_MAGIC) || ++ test_magic(lock_rwsem_ptr, ++ offsetof(struct rw_semaphore, rtmutex.wait_lock.magic), ++ SPINLOCK_MAGIC)) ++ return -EINVAL; ++#else + if (test_magic(lock_spinlock_ptr, + offsetof(spinlock_t, rlock.magic), + SPINLOCK_MAGIC) || +@@ -493,6 +508,7 @@ static int __init test_lockup_init(void) + offsetof(struct rw_semaphore, wait_lock.magic), + SPINLOCK_MAGIC)) + return -EINVAL; ++#endif + #endif + + if ((wait_state != TASK_RUNNING || +diff --git a/mm/Kconfig b/mm/Kconfig +index 4475bd9f8..00931cbec 100644 +--- a/mm/Kconfig ++++ b/mm/Kconfig +@@ -404,7 +404,7 @@ config NOMMU_INITIAL_TRIM_EXCESS + + config TRANSPARENT_HUGEPAGE + bool "Transparent Hugepage Support" +- depends on HAVE_ARCH_TRANSPARENT_HUGEPAGE ++ depends on HAVE_ARCH_TRANSPARENT_HUGEPAGE && !PREEMPT_RT + select COMPACTION + select XARRAY_MULTI + help +@@ -932,6 +932,9 @@ config ARCH_HAS_HUGEPD + config MAPPING_DIRTY_HELPERS + bool + ++config KMAP_LOCAL ++ bool ++ + config PIN_MEMORY + bool "Support for pin memory" + depends on MMU && ARM64 +diff --git a/mm/highmem.c b/mm/highmem.c +index efe38ab47..ad72e587c 100644 +--- a/mm/highmem.c ++++ b/mm/highmem.c +@@ -31,10 +31,6 @@ + #include + #include + +-#if defined(CONFIG_HIGHMEM) || defined(CONFIG_X86_32) +-DEFINE_PER_CPU(int, __kmap_atomic_idx); +-#endif +- + /* + * Virtual_count is not a pure "count". + * 0 means that it is not mapped, and has not been mapped +@@ -108,9 +104,7 @@ static inline wait_queue_head_t *get_pkmap_wait_queue_head(unsigned int color) + atomic_long_t _totalhigh_pages __read_mostly; + EXPORT_SYMBOL(_totalhigh_pages); + +-EXPORT_PER_CPU_SYMBOL(__kmap_atomic_idx); +- +-unsigned int nr_free_highpages (void) ++unsigned int __nr_free_highpages (void) + { + struct zone *zone; + unsigned int pages = 0; +@@ -147,7 +141,7 @@ pte_t * pkmap_page_table; + do { spin_unlock(&kmap_lock); (void)(flags); } while (0) + #endif + +-struct page *kmap_to_page(void *vaddr) ++struct page *__kmap_to_page(void *vaddr) + { + unsigned long addr = (unsigned long)vaddr; + +@@ -158,7 +152,7 @@ struct page *kmap_to_page(void *vaddr) + + return virt_to_page(addr); + } +-EXPORT_SYMBOL(kmap_to_page); ++EXPORT_SYMBOL(__kmap_to_page); + + static void flush_all_zero_pkmaps(void) + { +@@ -200,10 +194,7 @@ static void flush_all_zero_pkmaps(void) + flush_tlb_kernel_range(PKMAP_ADDR(0), PKMAP_ADDR(LAST_PKMAP)); + } + +-/** +- * kmap_flush_unused - flush all unused kmap mappings in order to remove stray mappings +- */ +-void kmap_flush_unused(void) ++void __kmap_flush_unused(void) + { + lock_kmap(); + flush_all_zero_pkmaps(); +@@ -428,7 +419,250 @@ void zero_user_segments(struct page *page, unsigned start1, unsigned end1, + } + EXPORT_SYMBOL(zero_user_segments); + #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ +-#endif /* CONFIG_HIGHMEM */ ++#endif /* CONFIG_HIGHMEM */ ++ ++#ifdef CONFIG_KMAP_LOCAL ++ ++#include ++ ++/* ++ * With DEBUG_HIGHMEM the stack depth is doubled and every second ++ * slot is unused which acts as a guard page ++ */ ++#ifdef CONFIG_DEBUG_HIGHMEM ++# define KM_INCR 2 ++#else ++# define KM_INCR 1 ++#endif ++ ++static inline int kmap_local_idx_push(void) ++{ ++ WARN_ON_ONCE(in_irq() && !irqs_disabled()); ++ current->kmap_ctrl.idx += KM_INCR; ++ BUG_ON(current->kmap_ctrl.idx >= KM_MAX_IDX); ++ return current->kmap_ctrl.idx - 1; ++ ++} ++ ++static inline int kmap_local_idx(void) ++{ ++ return current->kmap_ctrl.idx - 1; ++} ++ ++static inline void kmap_local_idx_pop(void) ++{ ++ current->kmap_ctrl.idx -= KM_INCR; ++ BUG_ON(current->kmap_ctrl.idx < 0); ++} ++ ++#ifndef arch_kmap_local_post_map ++# define arch_kmap_local_post_map(vaddr, pteval) do { } while (0) ++#endif ++ ++#ifndef arch_kmap_local_pre_unmap ++# define arch_kmap_local_pre_unmap(vaddr) do { } while (0) ++#endif ++ ++#ifndef arch_kmap_local_post_unmap ++# define arch_kmap_local_post_unmap(vaddr) do { } while (0) ++#endif ++ ++#ifndef arch_kmap_local_map_idx ++#define arch_kmap_local_map_idx(idx, pfn) kmap_local_calc_idx(idx) ++#endif ++ ++#ifndef arch_kmap_local_unmap_idx ++#define arch_kmap_local_unmap_idx(idx, vaddr) kmap_local_calc_idx(idx) ++#endif ++ ++#ifndef arch_kmap_local_high_get ++static inline void *arch_kmap_local_high_get(struct page *page) ++{ ++ return NULL; ++} ++#endif ++ ++/* Unmap a local mapping which was obtained by kmap_high_get() */ ++static inline bool kmap_high_unmap_local(unsigned long vaddr) ++{ ++#ifdef ARCH_NEEDS_KMAP_HIGH_GET ++ if (vaddr >= PKMAP_ADDR(0) && vaddr < PKMAP_ADDR(LAST_PKMAP)) { ++ kunmap_high(pte_page(pkmap_page_table[PKMAP_NR(vaddr)])); ++ return true; ++ } ++#endif ++ return false; ++} ++ ++static inline int kmap_local_calc_idx(int idx) ++{ ++ return idx + KM_MAX_IDX * smp_processor_id(); ++} ++ ++static pte_t *__kmap_pte; ++ ++static pte_t *kmap_get_pte(void) ++{ ++ if (!__kmap_pte) ++ __kmap_pte = virt_to_kpte(__fix_to_virt(FIX_KMAP_BEGIN)); ++ return __kmap_pte; ++} ++ ++void *__kmap_local_pfn_prot(unsigned long pfn, pgprot_t prot) ++{ ++ pte_t pteval, *kmap_pte = kmap_get_pte(); ++ unsigned long vaddr; ++ int idx; ++ ++ /* ++ * Disable migration so resulting virtual address is stable ++ * accross preemption. ++ */ ++ migrate_disable(); ++ preempt_disable(); ++ idx = arch_kmap_local_map_idx(kmap_local_idx_push(), pfn); ++ vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); ++ BUG_ON(!pte_none(*(kmap_pte - idx))); ++ pteval = pfn_pte(pfn, prot); ++ set_pte_at(&init_mm, vaddr, kmap_pte - idx, pteval); ++ arch_kmap_local_post_map(vaddr, pteval); ++ current->kmap_ctrl.pteval[kmap_local_idx()] = pteval; ++ preempt_enable(); ++ ++ return (void *)vaddr; ++} ++EXPORT_SYMBOL_GPL(__kmap_local_pfn_prot); ++ ++void *__kmap_local_page_prot(struct page *page, pgprot_t prot) ++{ ++ void *kmap; ++ ++ if (!PageHighMem(page)) ++ return page_address(page); ++ ++ /* Try kmap_high_get() if architecture has it enabled */ ++ kmap = arch_kmap_local_high_get(page); ++ if (kmap) ++ return kmap; ++ ++ return __kmap_local_pfn_prot(page_to_pfn(page), prot); ++} ++EXPORT_SYMBOL(__kmap_local_page_prot); ++ ++void kunmap_local_indexed(void *vaddr) ++{ ++ unsigned long addr = (unsigned long) vaddr & PAGE_MASK; ++ pte_t *kmap_pte = kmap_get_pte(); ++ int idx; ++ ++ if (addr < __fix_to_virt(FIX_KMAP_END) || ++ addr > __fix_to_virt(FIX_KMAP_BEGIN)) { ++ /* ++ * Handle mappings which were obtained by kmap_high_get() ++ * first as the virtual address of such mappings is below ++ * PAGE_OFFSET. Warn for all other addresses which are in ++ * the user space part of the virtual address space. ++ */ ++ if (!kmap_high_unmap_local(addr)) ++ WARN_ON_ONCE(addr < PAGE_OFFSET); ++ return; ++ } ++ ++ preempt_disable(); ++ idx = arch_kmap_local_unmap_idx(kmap_local_idx(), addr); ++ WARN_ON_ONCE(addr != __fix_to_virt(FIX_KMAP_BEGIN + idx)); ++ ++ arch_kmap_local_pre_unmap(addr); ++ pte_clear(&init_mm, addr, kmap_pte - idx); ++ arch_kmap_local_post_unmap(addr); ++ current->kmap_ctrl.pteval[kmap_local_idx()] = __pte(0); ++ kmap_local_idx_pop(); ++ preempt_enable(); ++ migrate_enable(); ++} ++EXPORT_SYMBOL(kunmap_local_indexed); ++ ++/* ++ * Invoked before switch_to(). This is safe even when during or after ++ * clearing the maps an interrupt which needs a kmap_local happens because ++ * the task::kmap_ctrl.idx is not modified by the unmapping code so a ++ * nested kmap_local will use the next unused index and restore the index ++ * on unmap. The already cleared kmaps of the outgoing task are irrelevant ++ * because the interrupt context does not know about them. The same applies ++ * when scheduling back in for an interrupt which happens before the ++ * restore is complete. ++ */ ++void __kmap_local_sched_out(void) ++{ ++ struct task_struct *tsk = current; ++ pte_t *kmap_pte = kmap_get_pte(); ++ int i; ++ ++ /* Clear kmaps */ ++ for (i = 0; i < tsk->kmap_ctrl.idx; i++) { ++ pte_t pteval = tsk->kmap_ctrl.pteval[i]; ++ unsigned long addr; ++ int idx; ++ ++ /* With debug all even slots are unmapped and act as guard */ ++ if (IS_ENABLED(CONFIG_DEBUG_HIGHMEM) && !(i & 0x01)) { ++ WARN_ON_ONCE(!pte_none(pteval)); ++ continue; ++ } ++ if (WARN_ON_ONCE(pte_none(pteval))) ++ continue; ++ ++ /* ++ * This is a horrible hack for XTENSA to calculate the ++ * coloured PTE index. Uses the PFN encoded into the pteval ++ * and the map index calculation because the actual mapped ++ * virtual address is not stored in task::kmap_ctrl. ++ * For any sane architecture this is optimized out. ++ */ ++ idx = arch_kmap_local_map_idx(i, pte_pfn(pteval)); ++ ++ addr = __fix_to_virt(FIX_KMAP_BEGIN + idx); ++ arch_kmap_local_pre_unmap(addr); ++ pte_clear(&init_mm, addr, kmap_pte - idx); ++ arch_kmap_local_post_unmap(addr); ++ } ++} ++ ++void __kmap_local_sched_in(void) ++{ ++ struct task_struct *tsk = current; ++ pte_t *kmap_pte = kmap_get_pte(); ++ int i; ++ ++ /* Restore kmaps */ ++ for (i = 0; i < tsk->kmap_ctrl.idx; i++) { ++ pte_t pteval = tsk->kmap_ctrl.pteval[i]; ++ unsigned long addr; ++ int idx; ++ ++ /* With debug all even slots are unmapped and act as guard */ ++ if (IS_ENABLED(CONFIG_DEBUG_HIGHMEM) && !(i & 0x01)) { ++ WARN_ON_ONCE(!pte_none(pteval)); ++ continue; ++ } ++ if (WARN_ON_ONCE(pte_none(pteval))) ++ continue; ++ ++ /* See comment in __kmap_local_sched_out() */ ++ idx = arch_kmap_local_map_idx(i, pte_pfn(pteval)); ++ addr = __fix_to_virt(FIX_KMAP_BEGIN + idx); ++ set_pte_at(&init_mm, addr, kmap_pte - idx, pteval); ++ arch_kmap_local_post_map(addr, pteval); ++ } ++} ++ ++void kmap_local_fork(struct task_struct *tsk) ++{ ++ if (WARN_ON_ONCE(tsk->kmap_ctrl.idx)) ++ memset(&tsk->kmap_ctrl, 0, sizeof(tsk->kmap_ctrl)); ++} ++ ++#endif + + #if defined(HASHED_PAGE_VIRTUAL) + +diff --git a/mm/memcontrol.c b/mm/memcontrol.c +index c1ff95b7a..d2fc369d9 100644 +--- a/mm/memcontrol.c ++++ b/mm/memcontrol.c +@@ -67,6 +67,7 @@ + #include + #include + #include "slab.h" ++#include + + #include + +@@ -97,6 +98,13 @@ bool cgroup_memory_noswap __read_mostly; + static DECLARE_WAIT_QUEUE_HEAD(memcg_cgwb_frn_waitq); + #endif + ++struct event_lock { ++ local_lock_t l; ++}; ++static DEFINE_PER_CPU(struct event_lock, event_lock) = { ++ .l = INIT_LOCAL_LOCK(l), ++}; ++ + static bool cgroup_memory_kswapd = false; + DEFINE_STATIC_KEY_FALSE(memcg_kswapd_key); + EXPORT_SYMBOL(memcg_kswapd_key); +@@ -743,6 +751,7 @@ void __mod_memcg_lruvec_state(struct lruvec *lruvec, enum node_stat_item idx, + pn = container_of(lruvec, struct mem_cgroup_per_node, lruvec); + memcg = pn->memcg; + ++ preempt_disable_rt(); + /* Update memcg */ + __this_cpu_add(memcg->vmstats_percpu->state[idx], val); + +@@ -750,6 +759,7 @@ void __mod_memcg_lruvec_state(struct lruvec *lruvec, enum node_stat_item idx, + __this_cpu_add(pn->lruvec_stats_percpu->state[idx], val); + + memcg_rstat_updated(memcg); ++ preempt_enable_rt(); + } + + /** +@@ -2159,6 +2169,7 @@ void unlock_page_memcg(struct page *page) + EXPORT_SYMBOL(unlock_page_memcg); + + struct memcg_stock_pcp { ++ local_lock_t lock; + struct mem_cgroup *cached; /* this never be root cgroup */ + unsigned int nr_pages; + +@@ -2210,7 +2221,7 @@ static bool consume_stock(struct mem_cgroup *memcg, unsigned int nr_pages) + if (nr_pages > MEMCG_CHARGE_BATCH) + return ret; + +- local_irq_save(flags); ++ local_lock_irqsave(&memcg_stock.lock, flags); + + stock = this_cpu_ptr(&memcg_stock); + if (memcg == stock->cached && stock->nr_pages >= nr_pages) { +@@ -2218,7 +2229,7 @@ static bool consume_stock(struct mem_cgroup *memcg, unsigned int nr_pages) + ret = true; + } + +- local_irq_restore(flags); ++ local_unlock_irqrestore(&memcg_stock.lock, flags); + + return ret; + } +@@ -2253,14 +2264,14 @@ static void drain_local_stock(struct work_struct *dummy) + * The only protection from memory hotplug vs. drain_stock races is + * that we always operate on local CPU stock here with IRQ disabled + */ +- local_irq_save(flags); ++ local_lock_irqsave(&memcg_stock.lock, flags); + + stock = this_cpu_ptr(&memcg_stock); + drain_obj_stock(stock); + drain_stock(stock); + clear_bit(FLUSHING_CACHED_CHARGE, &stock->flags); + +- local_irq_restore(flags); ++ local_unlock_irqrestore(&memcg_stock.lock, flags); + } + + /* +@@ -2272,7 +2283,7 @@ static void refill_stock(struct mem_cgroup *memcg, unsigned int nr_pages) + struct memcg_stock_pcp *stock; + unsigned long flags; + +- local_irq_save(flags); ++ local_lock_irqsave(&memcg_stock.lock, flags); + + stock = this_cpu_ptr(&memcg_stock); + if (stock->cached != memcg) { /* reset if necessary */ +@@ -2285,7 +2296,7 @@ static void refill_stock(struct mem_cgroup *memcg, unsigned int nr_pages) + if (stock->nr_pages > MEMCG_CHARGE_BATCH) + drain_stock(stock); + +- local_irq_restore(flags); ++ local_unlock_irqrestore(&memcg_stock.lock, flags); + } + + /* +@@ -2305,7 +2316,7 @@ static void drain_all_stock(struct mem_cgroup *root_memcg) + * as well as workers from this path always operate on the local + * per-cpu data. CPU up doesn't touch memcg_stock at all. + */ +- curcpu = get_cpu(); ++ curcpu = get_cpu_light(); + for_each_online_cpu(cpu) { + struct memcg_stock_pcp *stock = &per_cpu(memcg_stock, cpu); + struct mem_cgroup *memcg; +@@ -2328,7 +2339,7 @@ static void drain_all_stock(struct mem_cgroup *root_memcg) + schedule_work_on(cpu, &stock->work); + } + } +- put_cpu(); ++ put_cpu_light(); + mutex_unlock(&percpu_charge_mutex); + } + +@@ -3089,7 +3100,7 @@ static bool consume_obj_stock(struct obj_cgroup *objcg, unsigned int nr_bytes) + unsigned long flags; + bool ret = false; + +- local_irq_save(flags); ++ local_lock_irqsave(&memcg_stock.lock, flags); + + stock = this_cpu_ptr(&memcg_stock); + if (objcg == stock->cached_objcg && stock->nr_bytes >= nr_bytes) { +@@ -3097,7 +3108,7 @@ static bool consume_obj_stock(struct obj_cgroup *objcg, unsigned int nr_bytes) + ret = true; + } + +- local_irq_restore(flags); ++ local_unlock_irqrestore(&memcg_stock.lock, flags); + + return ret; + } +@@ -3153,7 +3164,7 @@ static void refill_obj_stock(struct obj_cgroup *objcg, unsigned int nr_bytes) + struct memcg_stock_pcp *stock; + unsigned long flags; + +- local_irq_save(flags); ++ local_lock_irqsave(&memcg_stock.lock, flags); + + stock = this_cpu_ptr(&memcg_stock); + if (stock->cached_objcg != objcg) { /* reset if necessary */ +@@ -3167,7 +3178,7 @@ static void refill_obj_stock(struct obj_cgroup *objcg, unsigned int nr_bytes) + if (stock->nr_bytes > PAGE_SIZE) + drain_obj_stock(stock); + +- local_irq_restore(flags); ++ local_unlock_irqrestore(&memcg_stock.lock, flags); + } + + int obj_cgroup_charge(struct obj_cgroup *objcg, gfp_t gfp, size_t size) +@@ -6039,12 +6050,12 @@ static int mem_cgroup_move_account(struct page *page, + + ret = 0; + +- local_irq_disable(); ++ local_lock_irq(&event_lock.l); + mem_cgroup_charge_statistics(to, page, nr_pages); + memcg_check_events(to, page); + mem_cgroup_charge_statistics(from, page, -nr_pages); + memcg_check_events(from, page); +- local_irq_enable(); ++ local_unlock_irq(&event_lock.l); + out_unlock: + unlock_page(page); + out: +@@ -7016,10 +7027,10 @@ int mem_cgroup_charge(struct page *page, struct mm_struct *mm, gfp_t gfp_mask) + css_get(&memcg->css); + commit_charge(page, memcg); + +- local_irq_disable(); ++ local_lock_irq(&event_lock.l); + mem_cgroup_charge_statistics(memcg, page, nr_pages); + memcg_check_events(memcg, page); +- local_irq_enable(); ++ local_unlock_irq(&event_lock.l); + + /* + * Cgroup1's unified memory+swap counter has been charged with the +@@ -7075,11 +7086,11 @@ static void uncharge_batch(const struct uncharge_gather *ug) + memcg_oom_recover(ug->memcg); + } + +- local_irq_save(flags); ++ local_lock_irqsave(&event_lock.l, flags); + __count_memcg_events(ug->memcg, PGPGOUT, ug->pgpgout); + __this_cpu_add(ug->memcg->vmstats_percpu->nr_page_events, ug->nr_memory); + memcg_check_events(ug->memcg, ug->dummy_page); +- local_irq_restore(flags); ++ local_unlock_irqrestore(&event_lock.l, flags); + + /* drop reference from uncharge_page */ + css_put(&ug->memcg->css); +@@ -7251,10 +7262,10 @@ void mem_cgroup_migrate(struct page *oldpage, struct page *newpage) + css_get(&memcg->css); + commit_charge(newpage, memcg); + +- local_irq_save(flags); ++ local_lock_irqsave(&event_lock.l, flags); + mem_cgroup_charge_statistics(memcg, newpage, nr_pages); + memcg_check_events(memcg, newpage); +- local_irq_restore(flags); ++ local_unlock_irqrestore(&event_lock.l, flags); + } + + DEFINE_STATIC_KEY_FALSE(memcg_sockets_enabled_key); +@@ -7391,9 +7402,13 @@ static int __init mem_cgroup_init(void) + cpuhp_setup_state_nocalls(CPUHP_MM_MEMCQ_DEAD, "mm/memctrl:dead", NULL, + memcg_hotplug_cpu_dead); + +- for_each_possible_cpu(cpu) +- INIT_WORK(&per_cpu_ptr(&memcg_stock, cpu)->work, +- drain_local_stock); ++ for_each_possible_cpu(cpu) { ++ struct memcg_stock_pcp *stock; ++ ++ stock = per_cpu_ptr(&memcg_stock, cpu); ++ INIT_WORK(&stock->work, drain_local_stock); ++ local_lock_init(&stock->lock); ++ } + + for_each_node(node) { + struct mem_cgroup_tree_per_node *rtpn; +@@ -7444,6 +7459,7 @@ void mem_cgroup_swapout(struct page *page, swp_entry_t entry) + struct mem_cgroup *memcg, *swap_memcg; + unsigned int nr_entries; + unsigned short oldid; ++ unsigned long flags; + + VM_BUG_ON_PAGE(PageLRU(page), page); + VM_BUG_ON_PAGE(page_count(page), page); +@@ -7489,9 +7505,13 @@ void mem_cgroup_swapout(struct page *page, swp_entry_t entry) + * important here to have the interrupts disabled because it is the + * only synchronisation we have for updating the per-CPU variables. + */ ++ local_lock_irqsave(&event_lock.l, flags); ++#ifndef CONFIG_PREEMPT_RT + VM_BUG_ON(!irqs_disabled()); ++#endif + mem_cgroup_charge_statistics(memcg, page, -nr_entries); + memcg_check_events(memcg, page); ++ local_unlock_irqrestore(&event_lock.l, flags); + + css_put(&memcg->css); + } +diff --git a/mm/page_alloc.c b/mm/page_alloc.c +index a27aed0b9..c1646f95b 100644 +--- a/mm/page_alloc.c ++++ b/mm/page_alloc.c +@@ -61,6 +61,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -389,6 +390,13 @@ EXPORT_SYMBOL(nr_node_ids); + EXPORT_SYMBOL(nr_online_nodes); + #endif + ++struct pa_lock { ++ local_lock_t l; ++}; ++static DEFINE_PER_CPU(struct pa_lock, pa_lock) = { ++ .l = INIT_LOCAL_LOCK(l), ++}; ++ + int page_group_by_mobility_disabled __read_mostly; + + #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT +@@ -1333,7 +1341,7 @@ static inline void prefetch_buddy(struct page *page) + } + + /* +- * Frees a number of pages from the PCP lists ++ * Frees a number of pages which have been collected from the pcp lists. + * Assumes all pages on list are in same zone, and of same order. + * count is the number of pages to free. + * +@@ -1343,15 +1351,56 @@ static inline void prefetch_buddy(struct page *page) + * And clear the zone's pages_scanned counter, to hold off the "all pages are + * pinned" detection logic. + */ +-static void free_pcppages_bulk(struct zone *zone, int count, +- struct per_cpu_pages *pcp) ++static void free_pcppages_bulk(struct zone *zone, struct list_head *head, ++ bool zone_retry) ++{ ++ bool isolated_pageblocks; ++ struct page *page, *tmp; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&zone->lock, flags); ++ isolated_pageblocks = has_isolate_pageblock(zone); ++ ++ /* ++ * Use safe version since after __free_one_page(), ++ * page->lru.next will not point to original list. ++ */ ++ list_for_each_entry_safe(page, tmp, head, lru) { ++ int mt = get_pcppage_migratetype(page); ++ ++ if (page_zone(page) != zone) { ++ /* ++ * free_unref_page_list() sorts pages by zone. If we end ++ * up with pages from a different NUMA nodes belonging ++ * to the same ZONE index then we need to redo with the ++ * correct ZONE pointer. Skip the page for now, redo it ++ * on the next iteration. ++ */ ++ WARN_ON_ONCE(zone_retry == false); ++ if (zone_retry) ++ continue; ++ } ++ ++ /* MIGRATE_ISOLATE page should not go to pcplists */ ++ VM_BUG_ON_PAGE(is_migrate_isolate(mt), page); ++ /* Pageblock could have been isolated meanwhile */ ++ if (unlikely(isolated_pageblocks)) ++ mt = get_pageblock_migratetype(page); ++ ++ list_del(&page->lru); ++ __free_one_page(page, page_to_pfn(page), zone, 0, mt, FPI_NONE); ++ trace_mm_page_pcpu_drain(page, 0, mt); ++ } ++ spin_unlock_irqrestore(&zone->lock, flags); ++} ++ ++static void isolate_pcp_pages(int count, struct per_cpu_pages *pcp, ++ struct list_head *dst) + { + int migratetype = 0; + int batch_free = 0; + int prefetch_nr = READ_ONCE(pcp->batch); +- bool isolated_pageblocks; +- struct page *page, *tmp; +- LIST_HEAD(head); ++ struct page *page; + + /* + * Ensure proper count is passed which otherwise would stuck in the +@@ -1388,7 +1437,7 @@ static void free_pcppages_bulk(struct zone *zone, int count, + if (bulkfree_pcp_prepare(page)) + continue; + +- list_add_tail(&page->lru, &head); ++ list_add_tail(&page->lru, dst); + + /* + * We are going to put the page back to the global +@@ -1405,26 +1454,6 @@ static void free_pcppages_bulk(struct zone *zone, int count, + } + } while (--count && --batch_free && !list_empty(list)); + } +- +- spin_lock(&zone->lock); +- isolated_pageblocks = has_isolate_pageblock(zone); +- +- /* +- * Use safe version since after __free_one_page(), +- * page->lru.next will not point to original list. +- */ +- list_for_each_entry_safe(page, tmp, &head, lru) { +- int mt = get_pcppage_migratetype(page); +- /* MIGRATE_ISOLATE page should not go to pcplists */ +- VM_BUG_ON_PAGE(is_migrate_isolate(mt), page); +- /* Pageblock could have been isolated meanwhile */ +- if (unlikely(isolated_pageblocks)) +- mt = get_pageblock_migratetype(page); +- +- __free_one_page(page, page_to_pfn(page), zone, 0, mt, FPI_NONE); +- trace_mm_page_pcpu_drain(page, 0, mt); +- } +- spin_unlock(&zone->lock); + } + + static void free_one_page(struct zone *zone, +@@ -1526,11 +1555,11 @@ static void __free_pages_ok(struct page *page, unsigned int order, + return; + + migratetype = get_pfnblock_migratetype(page, pfn); +- local_irq_save(flags); ++ local_lock_irqsave(&pa_lock.l, flags); + __count_vm_events(PGFREE, 1 << order); + free_one_page(page_zone(page), page, pfn, order, migratetype, + fpi_flags); +- local_irq_restore(flags); ++ local_unlock_irqrestore(&pa_lock.l, flags); + } + + void __free_pages_core(struct page *page, unsigned int order) +@@ -2941,13 +2970,18 @@ void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp) + { + unsigned long flags; + int to_drain, batch; ++ LIST_HEAD(dst); + +- local_irq_save(flags); ++ local_lock_irqsave(&pa_lock.l, flags); + batch = READ_ONCE(pcp->batch); + to_drain = min(pcp->count, batch); + if (to_drain > 0) +- free_pcppages_bulk(zone, to_drain, pcp); +- local_irq_restore(flags); ++ isolate_pcp_pages(to_drain, pcp, &dst); ++ ++ local_unlock_irqrestore(&pa_lock.l, flags); ++ ++ if (to_drain > 0) ++ free_pcppages_bulk(zone, &dst, false); + } + #endif + +@@ -2963,14 +2997,21 @@ static void drain_pages_zone(unsigned int cpu, struct zone *zone) + unsigned long flags; + struct per_cpu_pageset *pset; + struct per_cpu_pages *pcp; ++ LIST_HEAD(dst); ++ int count; + +- local_irq_save(flags); ++ local_lock_irqsave(&pa_lock.l, flags); + pset = per_cpu_ptr(zone->pageset, cpu); + + pcp = &pset->pcp; +- if (pcp->count) +- free_pcppages_bulk(zone, pcp->count, pcp); +- local_irq_restore(flags); ++ count = pcp->count; ++ if (count) ++ isolate_pcp_pages(count, pcp, &dst); ++ ++ local_unlock_irqrestore(&pa_lock.l, flags); ++ ++ if (count) ++ free_pcppages_bulk(zone, &dst, false); + } + + /* +@@ -3018,9 +3059,9 @@ static void drain_local_pages_wq(struct work_struct *work) + * cpu which is allright but we also have to make sure to not move to + * a different one. + */ +- preempt_disable(); ++ migrate_disable(); + drain_local_pages(drain->zone); +- preempt_enable(); ++ migrate_enable(); + } + + /* +@@ -3190,7 +3231,8 @@ static bool free_unref_page_prepare(struct page *page, unsigned long pfn) + return true; + } + +-static void free_unref_page_commit(struct page *page, unsigned long pfn) ++static void free_unref_page_commit(struct page *page, unsigned long pfn, ++ struct list_head *dst) + { + struct zone *zone = page_zone(page); + struct per_cpu_pages *pcp; +@@ -3219,7 +3261,8 @@ static void free_unref_page_commit(struct page *page, unsigned long pfn) + list_add(&page->lru, &pcp->lists[migratetype]); + pcp->count++; + if (pcp->count >= READ_ONCE(pcp->high)) +- free_pcppages_bulk(zone, READ_ONCE(pcp->batch), pcp); ++ ++ isolate_pcp_pages(READ_ONCE(pcp->batch), pcp, dst); + } + + /* +@@ -3229,6 +3272,8 @@ void free_unref_page(struct page *page) + { + unsigned long flags; + unsigned long pfn = page_to_pfn(page); ++ struct zone *zone = page_zone(page); ++ LIST_HEAD(dst); + + /* Free dynamic hugetlb page */ + if (free_page_to_dhugetlb_pool(page)) +@@ -3237,9 +3282,11 @@ void free_unref_page(struct page *page) + if (!free_unref_page_prepare(page, pfn)) + return; + +- local_irq_save(flags); +- free_unref_page_commit(page, pfn); +- local_irq_restore(flags); ++ local_lock_irqsave(&pa_lock.l, flags); ++ free_unref_page_commit(page, pfn, &dst); ++ local_unlock_irqrestore(&pa_lock.l, flags); ++ if (!list_empty(&dst)) ++ free_pcppages_bulk(zone, &dst, false); + } + + /* +@@ -3250,6 +3297,11 @@ void free_unref_page_list(struct list_head *list) + struct page *page, *next; + unsigned long flags, pfn; + int batch_count = 0; ++ struct list_head dsts[__MAX_NR_ZONES]; ++ int i; ++ ++ for (i = 0; i < __MAX_NR_ZONES; i++) ++ INIT_LIST_HEAD(&dsts[i]); + + /* Free dynamic hugetlb page list */ + free_page_list_to_dhugetlb_pool(list); +@@ -3262,25 +3314,42 @@ void free_unref_page_list(struct list_head *list) + set_page_private(page, pfn); + } + +- local_irq_save(flags); ++ local_lock_irqsave(&pa_lock.l, flags); + list_for_each_entry_safe(page, next, list, lru) { + unsigned long pfn = page_private(page); ++ enum zone_type type; + + set_page_private(page, 0); + trace_mm_page_free_batched(page); +- free_unref_page_commit(page, pfn); ++ type = page_zonenum(page); ++ free_unref_page_commit(page, pfn, &dsts[type]); + + /* + * Guard against excessive IRQ disabled times when we get + * a large list of pages to free. + */ + if (++batch_count == SWAP_CLUSTER_MAX) { +- local_irq_restore(flags); ++ local_unlock_irqrestore(&pa_lock.l, flags); + batch_count = 0; +- local_irq_save(flags); ++ local_lock_irqsave(&pa_lock.l, flags); + } + } +- local_irq_restore(flags); ++ local_unlock_irqrestore(&pa_lock.l, flags); ++ ++ for (i = 0; i < __MAX_NR_ZONES; ) { ++ struct page *page; ++ struct zone *zone; ++ ++ if (list_empty(&dsts[i])) { ++ i++; ++ continue; ++ } ++ ++ page = list_first_entry(&dsts[i], struct page, lru); ++ zone = page_zone(page); ++ ++ free_pcppages_bulk(zone, &dsts[i], true); ++ } + } + + /* +@@ -3437,7 +3506,7 @@ static struct page *rmqueue_pcplist(struct zone *preferred_zone, + struct page *page; + unsigned long flags; + +- local_irq_save(flags); ++ local_lock_irqsave(&pa_lock.l, flags); + pcp = &this_cpu_ptr(zone->pageset)->pcp; + list = &pcp->lists[migratetype]; + page = __rmqueue_pcplist(zone, migratetype, alloc_flags, pcp, list); +@@ -3445,7 +3514,7 @@ static struct page *rmqueue_pcplist(struct zone *preferred_zone, + __count_zid_vm_events(PGALLOC, page_zonenum(page), 1); + zone_statistics(preferred_zone, zone); + } +- local_irq_restore(flags); ++ local_unlock_irqrestore(&pa_lock.l, flags); + return page; + } + +@@ -3479,7 +3548,8 @@ struct page *rmqueue(struct zone *preferred_zone, + * allocate greater than order-1 page units with __GFP_NOFAIL. + */ + WARN_ON_ONCE((gfp_flags & __GFP_NOFAIL) && (order > 1)); +- spin_lock_irqsave(&zone->lock, flags); ++ local_lock_irqsave(&pa_lock.l, flags); ++ spin_lock(&zone->lock); + + do { + page = NULL; +@@ -3505,7 +3575,7 @@ struct page *rmqueue(struct zone *preferred_zone, + + __count_zid_vm_events(PGALLOC, page_zonenum(page), 1 << order); + zone_statistics(preferred_zone, zone); +- local_irq_restore(flags); ++ local_unlock_irqrestore(&pa_lock.l, flags); + + out: + /* Separate test+clear to avoid unnecessary atomics */ +@@ -3518,7 +3588,7 @@ struct page *rmqueue(struct zone *preferred_zone, + return page; + + failed: +- local_irq_restore(flags); ++ local_unlock_irqrestore(&pa_lock.l, flags); + return NULL; + } + +@@ -9066,7 +9136,7 @@ void zone_pcp_reset(struct zone *zone) + struct per_cpu_pageset *pset; + + /* avoid races with drain_pages() */ +- local_irq_save(flags); ++ local_lock_irqsave(&pa_lock.l, flags); + if (zone->pageset != &boot_pageset) { + for_each_online_cpu(cpu) { + pset = per_cpu_ptr(zone->pageset, cpu); +@@ -9075,7 +9145,7 @@ void zone_pcp_reset(struct zone *zone) + free_percpu(zone->pageset); + zone->pageset = &boot_pageset; + } +- local_irq_restore(flags); ++ local_unlock_irqrestore(&pa_lock.l, flags); + } + + #ifdef CONFIG_MEMORY_HOTREMOVE +diff --git a/mm/shmem.c b/mm/shmem.c +index 746e48454..d8f03bb23 100644 +--- a/mm/shmem.c ++++ b/mm/shmem.c +@@ -307,10 +307,10 @@ static int shmem_reserve_inode(struct super_block *sb, ino_t *inop) + ino_t ino; + + if (!(sb->s_flags & SB_KERNMOUNT)) { +- spin_lock(&sbinfo->stat_lock); ++ raw_spin_lock(&sbinfo->stat_lock); + if (sbinfo->max_inodes) { + if (!sbinfo->free_inodes) { +- spin_unlock(&sbinfo->stat_lock); ++ raw_spin_unlock(&sbinfo->stat_lock); + return -ENOSPC; + } + sbinfo->free_inodes--; +@@ -333,7 +333,7 @@ static int shmem_reserve_inode(struct super_block *sb, ino_t *inop) + } + *inop = ino; + } +- spin_unlock(&sbinfo->stat_lock); ++ raw_spin_unlock(&sbinfo->stat_lock); + } else if (inop) { + /* + * __shmem_file_setup, one of our callers, is lock-free: it +@@ -348,13 +348,14 @@ static int shmem_reserve_inode(struct super_block *sb, ino_t *inop) + * to worry about things like glibc compatibility. + */ + ino_t *next_ino; ++ + next_ino = per_cpu_ptr(sbinfo->ino_batch, get_cpu()); + ino = *next_ino; + if (unlikely(ino % SHMEM_INO_BATCH == 0)) { +- spin_lock(&sbinfo->stat_lock); ++ raw_spin_lock(&sbinfo->stat_lock); + ino = sbinfo->next_ino; + sbinfo->next_ino += SHMEM_INO_BATCH; +- spin_unlock(&sbinfo->stat_lock); ++ raw_spin_unlock(&sbinfo->stat_lock); + if (unlikely(is_zero_ino(ino))) + ino++; + } +@@ -370,9 +371,9 @@ static void shmem_free_inode(struct super_block *sb) + { + struct shmem_sb_info *sbinfo = SHMEM_SB(sb); + if (sbinfo->max_inodes) { +- spin_lock(&sbinfo->stat_lock); ++ raw_spin_lock(&sbinfo->stat_lock); + sbinfo->free_inodes++; +- spin_unlock(&sbinfo->stat_lock); ++ raw_spin_unlock(&sbinfo->stat_lock); + } + } + +@@ -1480,10 +1481,10 @@ static struct mempolicy *shmem_get_sbmpol(struct shmem_sb_info *sbinfo) + { + struct mempolicy *mpol = NULL; + if (sbinfo->mpol) { +- spin_lock(&sbinfo->stat_lock); /* prevent replace/use races */ ++ raw_spin_lock(&sbinfo->stat_lock); /* prevent replace/use races */ + mpol = sbinfo->mpol; + mpol_get(mpol); +- spin_unlock(&sbinfo->stat_lock); ++ raw_spin_unlock(&sbinfo->stat_lock); + } + return mpol; + } +@@ -3534,9 +3535,10 @@ static int shmem_reconfigure(struct fs_context *fc) + struct shmem_options *ctx = fc->fs_private; + struct shmem_sb_info *sbinfo = SHMEM_SB(fc->root->d_sb); + unsigned long inodes; ++ struct mempolicy *mpol = NULL; + const char *err; + +- spin_lock(&sbinfo->stat_lock); ++ raw_spin_lock(&sbinfo->stat_lock); + inodes = sbinfo->max_inodes - sbinfo->free_inodes; + if ((ctx->seen & SHMEM_SEEN_BLOCKS) && ctx->blocks) { + if (!sbinfo->max_blocks) { +@@ -3581,14 +3583,15 @@ static int shmem_reconfigure(struct fs_context *fc) + * Preserve previous mempolicy unless mpol remount option was specified. + */ + if (ctx->mpol) { +- mpol_put(sbinfo->mpol); ++ mpol = sbinfo->mpol; + sbinfo->mpol = ctx->mpol; /* transfers initial ref */ + ctx->mpol = NULL; + } +- spin_unlock(&sbinfo->stat_lock); ++ raw_spin_unlock(&sbinfo->stat_lock); ++ mpol_put(mpol); + return 0; + out: +- spin_unlock(&sbinfo->stat_lock); ++ raw_spin_unlock(&sbinfo->stat_lock); + return invalfc(fc, "%s", err); + } + +@@ -3705,7 +3708,7 @@ static int shmem_fill_super(struct super_block *sb, struct fs_context *fc) + sbinfo->mpol = ctx->mpol; + ctx->mpol = NULL; + +- spin_lock_init(&sbinfo->stat_lock); ++ raw_spin_lock_init(&sbinfo->stat_lock); + if (percpu_counter_init(&sbinfo->used_blocks, 0, GFP_KERNEL)) + goto failed; + spin_lock_init(&sbinfo->shrinklist_lock); +diff --git a/mm/slab.c b/mm/slab.c +index ae84578f3..a65a5f169 100644 +--- a/mm/slab.c ++++ b/mm/slab.c +@@ -234,7 +234,7 @@ static void kmem_cache_node_init(struct kmem_cache_node *parent) + parent->shared = NULL; + parent->alien = NULL; + parent->colour_next = 0; +- spin_lock_init(&parent->list_lock); ++ raw_spin_lock_init(&parent->list_lock); + parent->free_objects = 0; + parent->free_touched = 0; + } +@@ -559,9 +559,9 @@ static noinline void cache_free_pfmemalloc(struct kmem_cache *cachep, + page_node = page_to_nid(page); + n = get_node(cachep, page_node); + +- spin_lock(&n->list_lock); ++ raw_spin_lock(&n->list_lock); + free_block(cachep, &objp, 1, page_node, &list); +- spin_unlock(&n->list_lock); ++ raw_spin_unlock(&n->list_lock); + + slabs_destroy(cachep, &list); + } +@@ -699,7 +699,7 @@ static void __drain_alien_cache(struct kmem_cache *cachep, + struct kmem_cache_node *n = get_node(cachep, node); + + if (ac->avail) { +- spin_lock(&n->list_lock); ++ raw_spin_lock(&n->list_lock); + /* + * Stuff objects into the remote nodes shared array first. + * That way we could avoid the overhead of putting the objects +@@ -710,7 +710,7 @@ static void __drain_alien_cache(struct kmem_cache *cachep, + + free_block(cachep, ac->entry, ac->avail, node, list); + ac->avail = 0; +- spin_unlock(&n->list_lock); ++ raw_spin_unlock(&n->list_lock); + } + } + +@@ -783,9 +783,9 @@ static int __cache_free_alien(struct kmem_cache *cachep, void *objp, + slabs_destroy(cachep, &list); + } else { + n = get_node(cachep, page_node); +- spin_lock(&n->list_lock); ++ raw_spin_lock(&n->list_lock); + free_block(cachep, &objp, 1, page_node, &list); +- spin_unlock(&n->list_lock); ++ raw_spin_unlock(&n->list_lock); + slabs_destroy(cachep, &list); + } + return 1; +@@ -826,10 +826,10 @@ static int init_cache_node(struct kmem_cache *cachep, int node, gfp_t gfp) + */ + n = get_node(cachep, node); + if (n) { +- spin_lock_irq(&n->list_lock); ++ raw_spin_lock_irq(&n->list_lock); + n->free_limit = (1 + nr_cpus_node(node)) * cachep->batchcount + + cachep->num; +- spin_unlock_irq(&n->list_lock); ++ raw_spin_unlock_irq(&n->list_lock); + + return 0; + } +@@ -908,7 +908,7 @@ static int setup_kmem_cache_node(struct kmem_cache *cachep, + goto fail; + + n = get_node(cachep, node); +- spin_lock_irq(&n->list_lock); ++ raw_spin_lock_irq(&n->list_lock); + if (n->shared && force_change) { + free_block(cachep, n->shared->entry, + n->shared->avail, node, &list); +@@ -926,7 +926,7 @@ static int setup_kmem_cache_node(struct kmem_cache *cachep, + new_alien = NULL; + } + +- spin_unlock_irq(&n->list_lock); ++ raw_spin_unlock_irq(&n->list_lock); + slabs_destroy(cachep, &list); + + /* +@@ -965,7 +965,7 @@ static void cpuup_canceled(long cpu) + if (!n) + continue; + +- spin_lock_irq(&n->list_lock); ++ raw_spin_lock_irq(&n->list_lock); + + /* Free limit for this kmem_cache_node */ + n->free_limit -= cachep->batchcount; +@@ -976,7 +976,7 @@ static void cpuup_canceled(long cpu) + nc->avail = 0; + + if (!cpumask_empty(mask)) { +- spin_unlock_irq(&n->list_lock); ++ raw_spin_unlock_irq(&n->list_lock); + goto free_slab; + } + +@@ -990,7 +990,7 @@ static void cpuup_canceled(long cpu) + alien = n->alien; + n->alien = NULL; + +- spin_unlock_irq(&n->list_lock); ++ raw_spin_unlock_irq(&n->list_lock); + + kfree(shared); + if (alien) { +@@ -1174,7 +1174,7 @@ static void __init init_list(struct kmem_cache *cachep, struct kmem_cache_node * + /* + * Do not assume that spinlocks can be initialized via memcpy: + */ +- spin_lock_init(&ptr->list_lock); ++ raw_spin_lock_init(&ptr->list_lock); + + MAKE_ALL_LISTS(cachep, ptr, nodeid); + cachep->node[nodeid] = ptr; +@@ -1345,11 +1345,11 @@ slab_out_of_memory(struct kmem_cache *cachep, gfp_t gfpflags, int nodeid) + for_each_kmem_cache_node(cachep, node, n) { + unsigned long total_slabs, free_slabs, free_objs; + +- spin_lock_irqsave(&n->list_lock, flags); ++ raw_spin_lock_irqsave(&n->list_lock, flags); + total_slabs = n->total_slabs; + free_slabs = n->free_slabs; + free_objs = n->free_objects; +- spin_unlock_irqrestore(&n->list_lock, flags); ++ raw_spin_unlock_irqrestore(&n->list_lock, flags); + + pr_warn(" node %d: slabs: %ld/%ld, objs: %ld/%ld\n", + node, total_slabs - free_slabs, total_slabs, +@@ -2106,7 +2106,7 @@ static void check_spinlock_acquired(struct kmem_cache *cachep) + { + #ifdef CONFIG_SMP + check_irq_off(); +- assert_spin_locked(&get_node(cachep, numa_mem_id())->list_lock); ++ assert_raw_spin_locked(&get_node(cachep, numa_mem_id())->list_lock); + #endif + } + +@@ -2114,7 +2114,7 @@ static void check_spinlock_acquired_node(struct kmem_cache *cachep, int node) + { + #ifdef CONFIG_SMP + check_irq_off(); +- assert_spin_locked(&get_node(cachep, node)->list_lock); ++ assert_raw_spin_locked(&get_node(cachep, node)->list_lock); + #endif + } + +@@ -2154,9 +2154,9 @@ static void do_drain(void *arg) + check_irq_off(); + ac = cpu_cache_get(cachep); + n = get_node(cachep, node); +- spin_lock(&n->list_lock); ++ raw_spin_lock(&n->list_lock); + free_block(cachep, ac->entry, ac->avail, node, &list); +- spin_unlock(&n->list_lock); ++ raw_spin_unlock(&n->list_lock); + ac->avail = 0; + slabs_destroy(cachep, &list); + } +@@ -2174,9 +2174,9 @@ static void drain_cpu_caches(struct kmem_cache *cachep) + drain_alien_cache(cachep, n->alien); + + for_each_kmem_cache_node(cachep, node, n) { +- spin_lock_irq(&n->list_lock); ++ raw_spin_lock_irq(&n->list_lock); + drain_array_locked(cachep, n->shared, node, true, &list); +- spin_unlock_irq(&n->list_lock); ++ raw_spin_unlock_irq(&n->list_lock); + + slabs_destroy(cachep, &list); + } +@@ -2198,10 +2198,10 @@ static int drain_freelist(struct kmem_cache *cache, + nr_freed = 0; + while (nr_freed < tofree && !list_empty(&n->slabs_free)) { + +- spin_lock_irq(&n->list_lock); ++ raw_spin_lock_irq(&n->list_lock); + p = n->slabs_free.prev; + if (p == &n->slabs_free) { +- spin_unlock_irq(&n->list_lock); ++ raw_spin_unlock_irq(&n->list_lock); + goto out; + } + +@@ -2214,7 +2214,7 @@ static int drain_freelist(struct kmem_cache *cache, + * to the cache. + */ + n->free_objects -= cache->num; +- spin_unlock_irq(&n->list_lock); ++ raw_spin_unlock_irq(&n->list_lock); + slab_destroy(cache, page); + nr_freed++; + } +@@ -2650,7 +2650,7 @@ static void cache_grow_end(struct kmem_cache *cachep, struct page *page) + INIT_LIST_HEAD(&page->slab_list); + n = get_node(cachep, page_to_nid(page)); + +- spin_lock(&n->list_lock); ++ raw_spin_lock(&n->list_lock); + n->total_slabs++; + if (!page->active) { + list_add_tail(&page->slab_list, &n->slabs_free); +@@ -2660,7 +2660,7 @@ static void cache_grow_end(struct kmem_cache *cachep, struct page *page) + + STATS_INC_GROWN(cachep); + n->free_objects += cachep->num - page->active; +- spin_unlock(&n->list_lock); ++ raw_spin_unlock(&n->list_lock); + + fixup_objfreelist_debug(cachep, &list); + } +@@ -2826,7 +2826,7 @@ static struct page *get_first_slab(struct kmem_cache_node *n, bool pfmemalloc) + { + struct page *page; + +- assert_spin_locked(&n->list_lock); ++ assert_raw_spin_locked(&n->list_lock); + page = list_first_entry_or_null(&n->slabs_partial, struct page, + slab_list); + if (!page) { +@@ -2853,10 +2853,10 @@ static noinline void *cache_alloc_pfmemalloc(struct kmem_cache *cachep, + if (!gfp_pfmemalloc_allowed(flags)) + return NULL; + +- spin_lock(&n->list_lock); ++ raw_spin_lock(&n->list_lock); + page = get_first_slab(n, true); + if (!page) { +- spin_unlock(&n->list_lock); ++ raw_spin_unlock(&n->list_lock); + return NULL; + } + +@@ -2865,7 +2865,7 @@ static noinline void *cache_alloc_pfmemalloc(struct kmem_cache *cachep, + + fixup_slab_list(cachep, n, page, &list); + +- spin_unlock(&n->list_lock); ++ raw_spin_unlock(&n->list_lock); + fixup_objfreelist_debug(cachep, &list); + + return obj; +@@ -2924,7 +2924,7 @@ static void *cache_alloc_refill(struct kmem_cache *cachep, gfp_t flags) + if (!n->free_objects && (!shared || !shared->avail)) + goto direct_grow; + +- spin_lock(&n->list_lock); ++ raw_spin_lock(&n->list_lock); + shared = READ_ONCE(n->shared); + + /* See if we can refill from the shared array */ +@@ -2948,7 +2948,7 @@ static void *cache_alloc_refill(struct kmem_cache *cachep, gfp_t flags) + must_grow: + n->free_objects -= ac->avail; + alloc_done: +- spin_unlock(&n->list_lock); ++ raw_spin_unlock(&n->list_lock); + fixup_objfreelist_debug(cachep, &list); + + direct_grow: +@@ -3173,7 +3173,7 @@ static void *____cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, + BUG_ON(!n); + + check_irq_off(); +- spin_lock(&n->list_lock); ++ raw_spin_lock(&n->list_lock); + page = get_first_slab(n, false); + if (!page) + goto must_grow; +@@ -3191,12 +3191,12 @@ static void *____cache_alloc_node(struct kmem_cache *cachep, gfp_t flags, + + fixup_slab_list(cachep, n, page, &list); + +- spin_unlock(&n->list_lock); ++ raw_spin_unlock(&n->list_lock); + fixup_objfreelist_debug(cachep, &list); + return obj; + + must_grow: +- spin_unlock(&n->list_lock); ++ raw_spin_unlock(&n->list_lock); + page = cache_grow_begin(cachep, gfp_exact_node(flags), nodeid); + if (page) { + /* This slab isn't counted yet so don't update free_objects */ +@@ -3384,7 +3384,7 @@ static void cache_flusharray(struct kmem_cache *cachep, struct array_cache *ac) + + check_irq_off(); + n = get_node(cachep, node); +- spin_lock(&n->list_lock); ++ raw_spin_lock(&n->list_lock); + if (n->shared) { + struct array_cache *shared_array = n->shared; + int max = shared_array->limit - shared_array->avail; +@@ -3413,7 +3413,7 @@ static void cache_flusharray(struct kmem_cache *cachep, struct array_cache *ac) + STATS_SET_FREEABLE(cachep, i); + } + #endif +- spin_unlock(&n->list_lock); ++ raw_spin_unlock(&n->list_lock); + ac->avail -= batchcount; + memmove(ac->entry, &(ac->entry[batchcount]), sizeof(void *)*ac->avail); + slabs_destroy(cachep, &list); +@@ -3849,9 +3849,9 @@ static int do_tune_cpucache(struct kmem_cache *cachep, int limit, + + node = cpu_to_mem(cpu); + n = get_node(cachep, node); +- spin_lock_irq(&n->list_lock); ++ raw_spin_lock_irq(&n->list_lock); + free_block(cachep, ac->entry, ac->avail, node, &list); +- spin_unlock_irq(&n->list_lock); ++ raw_spin_unlock_irq(&n->list_lock); + slabs_destroy(cachep, &list); + } + free_percpu(prev); +@@ -3946,9 +3946,9 @@ static void drain_array(struct kmem_cache *cachep, struct kmem_cache_node *n, + return; + } + +- spin_lock_irq(&n->list_lock); ++ raw_spin_lock_irq(&n->list_lock); + drain_array_locked(cachep, ac, node, false, &list); +- spin_unlock_irq(&n->list_lock); ++ raw_spin_unlock_irq(&n->list_lock); + + slabs_destroy(cachep, &list); + } +@@ -4032,7 +4032,7 @@ void get_slabinfo(struct kmem_cache *cachep, struct slabinfo *sinfo) + + for_each_kmem_cache_node(cachep, node, n) { + check_irq_on(); +- spin_lock_irq(&n->list_lock); ++ raw_spin_lock_irq(&n->list_lock); + + total_slabs += n->total_slabs; + free_slabs += n->free_slabs; +@@ -4041,7 +4041,7 @@ void get_slabinfo(struct kmem_cache *cachep, struct slabinfo *sinfo) + if (n->shared) + shared_avail += n->shared->avail; + +- spin_unlock_irq(&n->list_lock); ++ raw_spin_unlock_irq(&n->list_lock); + } + num_objs = total_slabs * cachep->num; + active_slabs = total_slabs - free_slabs; +diff --git a/mm/slab.h b/mm/slab.h +index 8414c3451..d937f8673 100644 +--- a/mm/slab.h ++++ b/mm/slab.h +@@ -523,7 +523,7 @@ static inline void slab_post_alloc_hook(struct kmem_cache *s, + * The slab lists for all objects. + */ + struct kmem_cache_node { +- spinlock_t list_lock; ++ raw_spinlock_t list_lock; + + #ifdef CONFIG_SLAB + struct list_head slabs_partial; /* partial list first, better asm code */ +diff --git a/mm/slub.c b/mm/slub.c +index 7a7b0bf82..526122bea 100644 +--- a/mm/slub.c ++++ b/mm/slub.c +@@ -458,7 +458,7 @@ static inline bool cmpxchg_double_slab(struct kmem_cache *s, struct page *page, + + #ifdef CONFIG_SLUB_DEBUG + static unsigned long object_map[BITS_TO_LONGS(MAX_OBJS_PER_PAGE)]; +-static DEFINE_SPINLOCK(object_map_lock); ++static DEFINE_RAW_SPINLOCK(object_map_lock); + + /* + * Determine a map of object in use on a page. +@@ -474,7 +474,7 @@ static unsigned long *get_map(struct kmem_cache *s, struct page *page) + + VM_BUG_ON(!irqs_disabled()); + +- spin_lock(&object_map_lock); ++ raw_spin_lock(&object_map_lock); + + bitmap_zero(object_map, page->objects); + +@@ -487,7 +487,7 @@ static unsigned long *get_map(struct kmem_cache *s, struct page *page) + static void put_map(unsigned long *map) __releases(&object_map_lock) + { + VM_BUG_ON(map != object_map); +- spin_unlock(&object_map_lock); ++ raw_spin_unlock(&object_map_lock); + } + + static inline unsigned int size_from_object(struct kmem_cache *s) +@@ -1238,7 +1238,7 @@ static noinline int free_debug_processing( + unsigned long flags; + int ret = 0; + +- spin_lock_irqsave(&n->list_lock, flags); ++ raw_spin_lock_irqsave(&n->list_lock, flags); + slab_lock(page); + + if (s->flags & SLAB_CONSISTENCY_CHECKS) { +@@ -1273,7 +1273,7 @@ static noinline int free_debug_processing( + bulk_cnt, cnt); + + slab_unlock(page); +- spin_unlock_irqrestore(&n->list_lock, flags); ++ raw_spin_unlock_irqrestore(&n->list_lock, flags); + if (!ret) + slab_fix(s, "Object at 0x%p not freed", object); + return ret; +@@ -1521,6 +1521,12 @@ static bool freelist_corrupted(struct kmem_cache *s, struct page *page, + } + #endif /* CONFIG_SLUB_DEBUG */ + ++struct slub_free_list { ++ raw_spinlock_t lock; ++ struct list_head list; ++}; ++static DEFINE_PER_CPU(struct slub_free_list, slub_free_list); ++ + /* + * Hooks for other subsystems that check memory allocations. In a typical + * production configuration these hooks all should produce no code at all. +@@ -1776,10 +1782,18 @@ static struct page *allocate_slab(struct kmem_cache *s, gfp_t flags, int node) + void *start, *p, *next; + int idx; + bool shuffle; ++ bool enableirqs = false; + + flags &= gfp_allowed_mask; + + if (gfpflags_allow_blocking(flags)) ++ enableirqs = true; ++ ++#ifdef CONFIG_PREEMPT_RT ++ if (system_state > SYSTEM_BOOTING && system_state < SYSTEM_SUSPEND) ++ enableirqs = true; ++#endif ++ if (enableirqs) + local_irq_enable(); + + flags |= s->allocflags; +@@ -1838,7 +1852,7 @@ static struct page *allocate_slab(struct kmem_cache *s, gfp_t flags, int node) + page->frozen = 1; + + out: +- if (gfpflags_allow_blocking(flags)) ++ if (enableirqs) + local_irq_disable(); + if (!page) + return NULL; +@@ -1881,6 +1895,16 @@ static void __free_slab(struct kmem_cache *s, struct page *page) + __free_pages(page, order); + } + ++static void free_delayed(struct list_head *h) ++{ ++ while (!list_empty(h)) { ++ struct page *page = list_first_entry(h, struct page, lru); ++ ++ list_del(&page->lru); ++ __free_slab(page->slab_cache, page); ++ } ++} ++ + static void rcu_free_slab(struct rcu_head *h) + { + struct page *page = container_of(h, struct page, rcu_head); +@@ -1892,6 +1916,12 @@ static void free_slab(struct kmem_cache *s, struct page *page) + { + if (unlikely(s->flags & SLAB_TYPESAFE_BY_RCU)) { + call_rcu(&page->rcu_head, rcu_free_slab); ++ } else if (irqs_disabled()) { ++ struct slub_free_list *f = this_cpu_ptr(&slub_free_list); ++ ++ raw_spin_lock(&f->lock); ++ list_add(&page->lru, &f->list); ++ raw_spin_unlock(&f->lock); + } else + __free_slab(s, page); + } +@@ -1999,7 +2029,7 @@ static void *get_partial_node(struct kmem_cache *s, struct kmem_cache_node *n, + if (!n || !n->nr_partial) + return NULL; + +- spin_lock(&n->list_lock); ++ raw_spin_lock(&n->list_lock); + list_for_each_entry_safe(page, page2, &n->partial, slab_list) { + void *t; + +@@ -2024,7 +2054,7 @@ static void *get_partial_node(struct kmem_cache *s, struct kmem_cache_node *n, + break; + + } +- spin_unlock(&n->list_lock); ++ raw_spin_unlock(&n->list_lock); + return object; + } + +@@ -2267,7 +2297,7 @@ static void deactivate_slab(struct kmem_cache *s, struct page *page, + * that acquire_slab() will see a slab page that + * is frozen + */ +- spin_lock(&n->list_lock); ++ raw_spin_lock(&n->list_lock); + } + } else { + m = M_FULL; +@@ -2279,7 +2309,7 @@ static void deactivate_slab(struct kmem_cache *s, struct page *page, + * slabs from diagnostic functions will not see + * any frozen slabs. + */ +- spin_lock(&n->list_lock); ++ raw_spin_lock(&n->list_lock); + } + #endif + } +@@ -2304,7 +2334,7 @@ static void deactivate_slab(struct kmem_cache *s, struct page *page, + goto redo; + + if (lock) +- spin_unlock(&n->list_lock); ++ raw_spin_unlock(&n->list_lock); + + if (m == M_PARTIAL) + stat(s, tail); +@@ -2343,10 +2373,10 @@ static void unfreeze_partials(struct kmem_cache *s, + n2 = get_node(s, page_to_nid(page)); + if (n != n2) { + if (n) +- spin_unlock(&n->list_lock); ++ raw_spin_unlock(&n->list_lock); + + n = n2; +- spin_lock(&n->list_lock); ++ raw_spin_lock(&n->list_lock); + } + + do { +@@ -2375,7 +2405,7 @@ static void unfreeze_partials(struct kmem_cache *s, + } + + if (n) +- spin_unlock(&n->list_lock); ++ raw_spin_unlock(&n->list_lock); + + while (discard_page) { + page = discard_page; +@@ -2412,14 +2442,21 @@ static void put_cpu_partial(struct kmem_cache *s, struct page *page, int drain) + pobjects = oldpage->pobjects; + pages = oldpage->pages; + if (drain && pobjects > slub_cpu_partial(s)) { ++ struct slub_free_list *f; + unsigned long flags; ++ LIST_HEAD(tofree); + /* + * partial array is full. Move the existing + * set to the per node partial list. + */ + local_irq_save(flags); + unfreeze_partials(s, this_cpu_ptr(s->cpu_slab)); ++ f = this_cpu_ptr(&slub_free_list); ++ raw_spin_lock(&f->lock); ++ list_splice_init(&f->list, &tofree); ++ raw_spin_unlock(&f->lock); + local_irq_restore(flags); ++ free_delayed(&tofree); + oldpage = NULL; + pobjects = 0; + pages = 0; +@@ -2487,7 +2524,19 @@ static bool has_cpu_slab(int cpu, void *info) + + static void flush_all(struct kmem_cache *s) + { ++ LIST_HEAD(tofree); ++ int cpu; ++ + on_each_cpu_cond(has_cpu_slab, flush_cpu_slab, s, 1); ++ for_each_online_cpu(cpu) { ++ struct slub_free_list *f; ++ ++ f = &per_cpu(slub_free_list, cpu); ++ raw_spin_lock_irq(&f->lock); ++ list_splice_init(&f->list, &tofree); ++ raw_spin_unlock_irq(&f->lock); ++ free_delayed(&tofree); ++ } + } + + /* +@@ -2542,10 +2591,10 @@ static unsigned long count_partial(struct kmem_cache_node *n, + unsigned long x = 0; + struct page *page; + +- spin_lock_irqsave(&n->list_lock, flags); ++ raw_spin_lock_irqsave(&n->list_lock, flags); + list_for_each_entry(page, &n->partial, slab_list) + x += get_count(page); +- spin_unlock_irqrestore(&n->list_lock, flags); ++ raw_spin_unlock_irqrestore(&n->list_lock, flags); + return x; + } + #endif /* CONFIG_SLUB_DEBUG || CONFIG_SYSFS */ +@@ -2684,8 +2733,10 @@ static inline void *get_freelist(struct kmem_cache *s, struct page *page) + * already disabled (which is the case for bulk allocation). + */ + static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, +- unsigned long addr, struct kmem_cache_cpu *c) ++ unsigned long addr, struct kmem_cache_cpu *c, ++ struct list_head *to_free) + { ++ struct slub_free_list *f; + void *freelist; + struct page *page; + +@@ -2753,6 +2804,13 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, + VM_BUG_ON(!c->page->frozen); + c->freelist = get_freepointer(s, freelist); + c->tid = next_tid(c->tid); ++ ++out: ++ f = this_cpu_ptr(&slub_free_list); ++ raw_spin_lock(&f->lock); ++ list_splice_init(&f->list, to_free); ++ raw_spin_unlock(&f->lock); ++ + return freelist; + + new_slab: +@@ -2768,7 +2826,7 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, + + if (unlikely(!freelist)) { + slab_out_of_memory(s, gfpflags, node); +- return NULL; ++ goto out; + } + + page = c->page; +@@ -2781,7 +2839,7 @@ static void *___slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, + goto new_slab; /* Slab failed checks. Next slab needed */ + + deactivate_slab(s, page, get_freepointer(s, freelist), c); +- return freelist; ++ goto out; + } + + /* +@@ -2793,6 +2851,7 @@ static void *__slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, + { + void *p; + unsigned long flags; ++ LIST_HEAD(tofree); + + local_irq_save(flags); + #ifdef CONFIG_PREEMPTION +@@ -2804,8 +2863,9 @@ static void *__slab_alloc(struct kmem_cache *s, gfp_t gfpflags, int node, + c = this_cpu_ptr(s->cpu_slab); + #endif + +- p = ___slab_alloc(s, gfpflags, node, addr, c); ++ p = ___slab_alloc(s, gfpflags, node, addr, c, &tofree); + local_irq_restore(flags); ++ free_delayed(&tofree); + return p; + } + +@@ -2839,6 +2899,10 @@ static __always_inline void *slab_alloc_node(struct kmem_cache *s, + unsigned long tid; + struct obj_cgroup *objcg = NULL; + ++ if (IS_ENABLED(CONFIG_PREEMPT_RT) && IS_ENABLED(CONFIG_DEBUG_ATOMIC_SLEEP)) ++ WARN_ON_ONCE(!preemptible() && ++ (system_state > SYSTEM_BOOTING && system_state < SYSTEM_SUSPEND)); ++ + s = slab_pre_alloc_hook(s, &objcg, 1, gfpflags); + if (!s) + return NULL; +@@ -3013,7 +3077,7 @@ static void __slab_free(struct kmem_cache *s, struct page *page, + + do { + if (unlikely(n)) { +- spin_unlock_irqrestore(&n->list_lock, flags); ++ raw_spin_unlock_irqrestore(&n->list_lock, flags); + n = NULL; + } + prior = page->freelist; +@@ -3045,7 +3109,7 @@ static void __slab_free(struct kmem_cache *s, struct page *page, + * Otherwise the list_lock will synchronize with + * other processors updating the list of slabs. + */ +- spin_lock_irqsave(&n->list_lock, flags); ++ raw_spin_lock_irqsave(&n->list_lock, flags); + + } + } +@@ -3087,7 +3151,7 @@ static void __slab_free(struct kmem_cache *s, struct page *page, + add_partial(n, page, DEACTIVATE_TO_TAIL); + stat(s, FREE_ADD_PARTIAL); + } +- spin_unlock_irqrestore(&n->list_lock, flags); ++ raw_spin_unlock_irqrestore(&n->list_lock, flags); + return; + + slab_empty: +@@ -3102,7 +3166,7 @@ static void __slab_free(struct kmem_cache *s, struct page *page, + remove_full(s, n, page); + } + +- spin_unlock_irqrestore(&n->list_lock, flags); ++ raw_spin_unlock_irqrestore(&n->list_lock, flags); + stat(s, FREE_SLAB); + discard_slab(s, page); + } +@@ -3327,9 +3391,14 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, + void **p) + { + struct kmem_cache_cpu *c; ++ LIST_HEAD(to_free); + int i; + struct obj_cgroup *objcg = NULL; + ++ if (IS_ENABLED(CONFIG_PREEMPT_RT) && IS_ENABLED(CONFIG_DEBUG_ATOMIC_SLEEP)) ++ WARN_ON_ONCE(!preemptible() && ++ (system_state > SYSTEM_BOOTING && system_state < SYSTEM_SUSPEND)); ++ + /* memcg and kmem_cache debug support */ + s = slab_pre_alloc_hook(s, &objcg, size, flags); + if (unlikely(!s)) +@@ -3366,7 +3435,7 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, + * of re-populating per CPU c->freelist + */ + p[i] = ___slab_alloc(s, flags, NUMA_NO_NODE, +- _RET_IP_, c); ++ _RET_IP_, c, &to_free); + if (unlikely(!p[i])) + goto error; + +@@ -3381,6 +3450,7 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, + } + c->tid = next_tid(c->tid); + local_irq_enable(); ++ free_delayed(&to_free); + + /* Clear memory outside IRQ disabled fastpath loop */ + if (unlikely(slab_want_init_on_alloc(flags, s))) { +@@ -3395,6 +3465,7 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, gfp_t flags, size_t size, + return i; + error: + local_irq_enable(); ++ free_delayed(&to_free); + slab_post_alloc_hook(s, objcg, flags, i, p); + __kmem_cache_free_bulk(s, i, p); + return 0; +@@ -3530,7 +3601,7 @@ static void + init_kmem_cache_node(struct kmem_cache_node *n) + { + n->nr_partial = 0; +- spin_lock_init(&n->list_lock); ++ raw_spin_lock_init(&n->list_lock); + INIT_LIST_HEAD(&n->partial); + #ifdef CONFIG_SLUB_DEBUG + atomic_long_set(&n->nr_slabs, 0); +@@ -3925,7 +3996,7 @@ static void free_partial(struct kmem_cache *s, struct kmem_cache_node *n) + struct page *page, *h; + + BUG_ON(irqs_disabled()); +- spin_lock_irq(&n->list_lock); ++ raw_spin_lock_irq(&n->list_lock); + list_for_each_entry_safe(page, h, &n->partial, slab_list) { + if (!page->inuse) { + remove_partial(n, page); +@@ -3935,7 +4006,7 @@ static void free_partial(struct kmem_cache *s, struct kmem_cache_node *n) + "Objects remaining in %s on __kmem_cache_shutdown()"); + } + } +- spin_unlock_irq(&n->list_lock); ++ raw_spin_unlock_irq(&n->list_lock); + + list_for_each_entry_safe(page, h, &discard, slab_list) + discard_slab(s, page); +@@ -4204,7 +4275,7 @@ int __kmem_cache_shrink(struct kmem_cache *s) + for (i = 0; i < SHRINK_PROMOTE_MAX; i++) + INIT_LIST_HEAD(promote + i); + +- spin_lock_irqsave(&n->list_lock, flags); ++ raw_spin_lock_irqsave(&n->list_lock, flags); + + /* + * Build lists of slabs to discard or promote. +@@ -4235,7 +4306,7 @@ int __kmem_cache_shrink(struct kmem_cache *s) + for (i = SHRINK_PROMOTE_MAX - 1; i >= 0; i--) + list_splice(promote + i, &n->partial); + +- spin_unlock_irqrestore(&n->list_lock, flags); ++ raw_spin_unlock_irqrestore(&n->list_lock, flags); + + /* Release empty slabs */ + list_for_each_entry_safe(page, t, &discard, slab_list) +@@ -4411,6 +4482,12 @@ void __init kmem_cache_init(void) + static __initdata struct kmem_cache boot_kmem_cache, + boot_kmem_cache_node; + int node; ++ int cpu; ++ ++ for_each_possible_cpu(cpu) { ++ raw_spin_lock_init(&per_cpu(slub_free_list, cpu).lock); ++ INIT_LIST_HEAD(&per_cpu(slub_free_list, cpu).list); ++ } + + if (debug_guardpage_minorder()) + slub_max_order = 0; +@@ -4609,7 +4686,7 @@ static int validate_slab_node(struct kmem_cache *s, + struct page *page; + unsigned long flags; + +- spin_lock_irqsave(&n->list_lock, flags); ++ raw_spin_lock_irqsave(&n->list_lock, flags); + + list_for_each_entry(page, &n->partial, slab_list) { + validate_slab(s, page); +@@ -4631,7 +4708,7 @@ static int validate_slab_node(struct kmem_cache *s, + s->name, count, atomic_long_read(&n->nr_slabs)); + + out: +- spin_unlock_irqrestore(&n->list_lock, flags); ++ raw_spin_unlock_irqrestore(&n->list_lock, flags); + return count; + } + +@@ -4682,6 +4759,9 @@ static int alloc_loc_track(struct loc_track *t, unsigned long max, gfp_t flags) + struct location *l; + int order; + ++ if (IS_ENABLED(CONFIG_PREEMPT_RT) && flags == GFP_ATOMIC) ++ return 0; ++ + order = get_order(sizeof(struct location) * max); + + l = (void *)__get_free_pages(flags, order); +@@ -4810,12 +4890,12 @@ static int list_locations(struct kmem_cache *s, char *buf, + if (!atomic_long_read(&n->nr_slabs)) + continue; + +- spin_lock_irqsave(&n->list_lock, flags); ++ raw_spin_lock_irqsave(&n->list_lock, flags); + list_for_each_entry(page, &n->partial, slab_list) + process_slab(&t, s, page, alloc); + list_for_each_entry(page, &n->full, slab_list) + process_slab(&t, s, page, alloc); +- spin_unlock_irqrestore(&n->list_lock, flags); ++ raw_spin_unlock_irqrestore(&n->list_lock, flags); + } + + for (i = 0; i < t.count; i++) { +diff --git a/mm/vmalloc.c b/mm/vmalloc.c +index dadbea292..dd7da773b 100644 +--- a/mm/vmalloc.c ++++ b/mm/vmalloc.c +@@ -1886,7 +1886,7 @@ static void *new_vmap_block(unsigned int order, gfp_t gfp_mask) + struct vmap_block *vb; + struct vmap_area *va; + unsigned long vb_idx; +- int node, err; ++ int node, err, cpu; + void *vaddr; + + node = numa_node_id(); +@@ -1923,11 +1923,12 @@ static void *new_vmap_block(unsigned int order, gfp_t gfp_mask) + return ERR_PTR(err); + } + +- vbq = &get_cpu_var(vmap_block_queue); ++ cpu = get_cpu_light(); ++ vbq = this_cpu_ptr(&vmap_block_queue); + spin_lock(&vbq->lock); + list_add_tail_rcu(&vb->free_list, &vbq->free); + spin_unlock(&vbq->lock); +- put_cpu_var(vmap_block_queue); ++ put_cpu_light(); + + return vaddr; + } +@@ -1992,6 +1993,7 @@ static void *vb_alloc(unsigned long size, gfp_t gfp_mask) + struct vmap_block *vb; + void *vaddr = NULL; + unsigned int order; ++ int cpu; + + BUG_ON(offset_in_page(size)); + BUG_ON(size > PAGE_SIZE*VMAP_MAX_ALLOC); +@@ -2006,7 +2008,8 @@ static void *vb_alloc(unsigned long size, gfp_t gfp_mask) + order = get_order(size); + + rcu_read_lock(); +- vbq = &get_cpu_var(vmap_block_queue); ++ cpu = get_cpu_light(); ++ vbq = this_cpu_ptr(&vmap_block_queue); + list_for_each_entry_rcu(vb, &vbq->free, free_list) { + unsigned long pages_off; + +@@ -2029,7 +2032,7 @@ static void *vb_alloc(unsigned long size, gfp_t gfp_mask) + break; + } + +- put_cpu_var(vmap_block_queue); ++ put_cpu_light(); + rcu_read_unlock(); + + /* Allocate new block if nothing was found */ +diff --git a/mm/vmstat.c b/mm/vmstat.c +index 2d9d742ec..a0a557510 100644 +--- a/mm/vmstat.c ++++ b/mm/vmstat.c +@@ -321,6 +321,7 @@ void __mod_zone_page_state(struct zone *zone, enum zone_stat_item item, + long x; + long t; + ++ preempt_disable_rt(); + x = delta + __this_cpu_read(*p); + + t = __this_cpu_read(pcp->stat_threshold); +@@ -330,6 +331,7 @@ void __mod_zone_page_state(struct zone *zone, enum zone_stat_item item, + x = 0; + } + __this_cpu_write(*p, x); ++ preempt_enable_rt(); + } + EXPORT_SYMBOL(__mod_zone_page_state); + +@@ -346,6 +348,7 @@ void __mod_node_page_state(struct pglist_data *pgdat, enum node_stat_item item, + delta >>= PAGE_SHIFT; + } + ++ preempt_disable_rt(); + x = delta + __this_cpu_read(*p); + + t = __this_cpu_read(pcp->stat_threshold); +@@ -355,6 +358,7 @@ void __mod_node_page_state(struct pglist_data *pgdat, enum node_stat_item item, + x = 0; + } + __this_cpu_write(*p, x); ++ preempt_enable_rt(); + } + EXPORT_SYMBOL(__mod_node_page_state); + +@@ -387,6 +391,7 @@ void __inc_zone_state(struct zone *zone, enum zone_stat_item item) + s8 __percpu *p = pcp->vm_stat_diff + item; + s8 v, t; + ++ preempt_disable_rt(); + v = __this_cpu_inc_return(*p); + t = __this_cpu_read(pcp->stat_threshold); + if (unlikely(v > t)) { +@@ -395,6 +400,7 @@ void __inc_zone_state(struct zone *zone, enum zone_stat_item item) + zone_page_state_add(v + overstep, zone, item); + __this_cpu_write(*p, -overstep); + } ++ preempt_enable_rt(); + } + + void __inc_node_state(struct pglist_data *pgdat, enum node_stat_item item) +@@ -405,6 +411,7 @@ void __inc_node_state(struct pglist_data *pgdat, enum node_stat_item item) + + VM_WARN_ON_ONCE(vmstat_item_in_bytes(item)); + ++ preempt_disable_rt(); + v = __this_cpu_inc_return(*p); + t = __this_cpu_read(pcp->stat_threshold); + if (unlikely(v > t)) { +@@ -413,6 +420,7 @@ void __inc_node_state(struct pglist_data *pgdat, enum node_stat_item item) + node_page_state_add(v + overstep, pgdat, item); + __this_cpu_write(*p, -overstep); + } ++ preempt_enable_rt(); + } + + void __inc_zone_page_state(struct page *page, enum zone_stat_item item) +@@ -433,6 +441,7 @@ void __dec_zone_state(struct zone *zone, enum zone_stat_item item) + s8 __percpu *p = pcp->vm_stat_diff + item; + s8 v, t; + ++ preempt_disable_rt(); + v = __this_cpu_dec_return(*p); + t = __this_cpu_read(pcp->stat_threshold); + if (unlikely(v < - t)) { +@@ -441,6 +450,7 @@ void __dec_zone_state(struct zone *zone, enum zone_stat_item item) + zone_page_state_add(v - overstep, zone, item); + __this_cpu_write(*p, overstep); + } ++ preempt_enable_rt(); + } + + void __dec_node_state(struct pglist_data *pgdat, enum node_stat_item item) +@@ -451,6 +461,7 @@ void __dec_node_state(struct pglist_data *pgdat, enum node_stat_item item) + + VM_WARN_ON_ONCE(vmstat_item_in_bytes(item)); + ++ preempt_disable_rt(); + v = __this_cpu_dec_return(*p); + t = __this_cpu_read(pcp->stat_threshold); + if (unlikely(v < - t)) { +@@ -459,6 +470,7 @@ void __dec_node_state(struct pglist_data *pgdat, enum node_stat_item item) + node_page_state_add(v - overstep, pgdat, item); + __this_cpu_write(*p, overstep); + } ++ preempt_enable_rt(); + } + + void __dec_zone_page_state(struct page *page, enum zone_stat_item item) +diff --git a/mm/workingset.c b/mm/workingset.c +index 4a30e4a81..4c92584ca 100644 +--- a/mm/workingset.c ++++ b/mm/workingset.c +@@ -431,6 +431,8 @@ static struct list_lru shadow_nodes; + + void workingset_update_node(struct xa_node *node) + { ++ struct address_space *mapping; ++ + /* + * Track non-empty nodes that contain only shadow entries; + * unlink those that contain pages or are being freed. +@@ -439,7 +441,8 @@ void workingset_update_node(struct xa_node *node) + * already where they should be. The list_empty() test is safe + * as node->private_list is protected by the i_pages lock. + */ +- VM_WARN_ON_ONCE(!irqs_disabled()); /* For __inc_lruvec_page_state */ ++ mapping = container_of(node->array, struct address_space, i_pages); ++ lockdep_assert_held(&mapping->i_pages.xa_lock); + + if (node->count && node->count == node->nr_values) { + if (list_empty(&node->private_list)) { +diff --git a/mm/z3fold.c b/mm/z3fold.c +index f75c638c6..6fdf4774f 100644 +--- a/mm/z3fold.c ++++ b/mm/z3fold.c +@@ -623,14 +623,16 @@ static inline void add_to_unbuddied(struct z3fold_pool *pool, + { + if (zhdr->first_chunks == 0 || zhdr->last_chunks == 0 || + zhdr->middle_chunks == 0) { +- struct list_head *unbuddied = get_cpu_ptr(pool->unbuddied); +- ++ struct list_head *unbuddied; + int freechunks = num_free_chunks(zhdr); ++ ++ migrate_disable(); ++ unbuddied = this_cpu_ptr(pool->unbuddied); + spin_lock(&pool->lock); + list_add(&zhdr->buddy, &unbuddied[freechunks]); + spin_unlock(&pool->lock); + zhdr->cpu = smp_processor_id(); +- put_cpu_ptr(pool->unbuddied); ++ migrate_enable(); + } + } + +@@ -880,8 +882,9 @@ static inline struct z3fold_header *__z3fold_alloc(struct z3fold_pool *pool, + int chunks = size_to_chunks(size), i; + + lookup: ++ migrate_disable(); + /* First, try to find an unbuddied z3fold page. */ +- unbuddied = get_cpu_ptr(pool->unbuddied); ++ unbuddied = this_cpu_ptr(pool->unbuddied); + for_each_unbuddied_list(i, chunks) { + struct list_head *l = &unbuddied[i]; + +@@ -899,7 +902,7 @@ static inline struct z3fold_header *__z3fold_alloc(struct z3fold_pool *pool, + !z3fold_page_trylock(zhdr)) { + spin_unlock(&pool->lock); + zhdr = NULL; +- put_cpu_ptr(pool->unbuddied); ++ migrate_enable(); + if (can_sleep) + cond_resched(); + goto lookup; +@@ -913,7 +916,7 @@ static inline struct z3fold_header *__z3fold_alloc(struct z3fold_pool *pool, + test_bit(PAGE_CLAIMED, &page->private)) { + z3fold_page_unlock(zhdr); + zhdr = NULL; +- put_cpu_ptr(pool->unbuddied); ++ migrate_enable(); + if (can_sleep) + cond_resched(); + goto lookup; +@@ -928,7 +931,7 @@ static inline struct z3fold_header *__z3fold_alloc(struct z3fold_pool *pool, + kref_get(&zhdr->refcount); + break; + } +- put_cpu_ptr(pool->unbuddied); ++ migrate_enable(); + + if (!zhdr) { + int cpu; +diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c +index 73cd50735..142170f87 100644 +--- a/mm/zsmalloc.c ++++ b/mm/zsmalloc.c +@@ -57,6 +57,7 @@ + #include + #include + #include ++#include + + #define ZSPAGE_MAGIC 0x58 + +@@ -77,6 +78,20 @@ + + #define ZS_HANDLE_SIZE (sizeof(unsigned long)) + ++#ifdef CONFIG_PREEMPT_RT ++ ++struct zsmalloc_handle { ++ unsigned long addr; ++ spinlock_t lock; ++}; ++ ++#define ZS_HANDLE_ALLOC_SIZE (sizeof(struct zsmalloc_handle)) ++ ++#else ++ ++#define ZS_HANDLE_ALLOC_SIZE (sizeof(unsigned long)) ++#endif ++ + /* + * Object location (, ) is encoded as + * a single (unsigned long) handle value. +@@ -293,6 +308,7 @@ struct zspage { + }; + + struct mapping_area { ++ local_lock_t lock; + char *vm_buf; /* copy buffer for objects that span pages */ + char *vm_addr; /* address of kmap_atomic()'ed pages */ + enum zs_mapmode vm_mm; /* mapping mode */ +@@ -322,7 +338,7 @@ static void SetZsPageMovable(struct zs_pool *pool, struct zspage *zspage) {} + + static int create_cache(struct zs_pool *pool) + { +- pool->handle_cachep = kmem_cache_create("zs_handle", ZS_HANDLE_SIZE, ++ pool->handle_cachep = kmem_cache_create("zs_handle", ZS_HANDLE_ALLOC_SIZE, + 0, 0, NULL); + if (!pool->handle_cachep) + return 1; +@@ -346,10 +362,27 @@ static void destroy_cache(struct zs_pool *pool) + + static unsigned long cache_alloc_handle(struct zs_pool *pool, gfp_t gfp) + { +- return (unsigned long)kmem_cache_alloc(pool->handle_cachep, +- gfp & ~(__GFP_HIGHMEM|__GFP_MOVABLE)); ++ void *p; ++ ++ p = kmem_cache_alloc(pool->handle_cachep, ++ gfp & ~(__GFP_HIGHMEM|__GFP_MOVABLE)); ++#ifdef CONFIG_PREEMPT_RT ++ if (p) { ++ struct zsmalloc_handle *zh = p; ++ ++ spin_lock_init(&zh->lock); ++ } ++#endif ++ return (unsigned long)p; + } + ++#ifdef CONFIG_PREEMPT_RT ++static struct zsmalloc_handle *zs_get_pure_handle(unsigned long handle) ++{ ++ return (void *)(handle &~((1 << OBJ_TAG_BITS) - 1)); ++} ++#endif ++ + static void cache_free_handle(struct zs_pool *pool, unsigned long handle) + { + kmem_cache_free(pool->handle_cachep, (void *)handle); +@@ -368,12 +401,18 @@ static void cache_free_zspage(struct zs_pool *pool, struct zspage *zspage) + + static void record_obj(unsigned long handle, unsigned long obj) + { ++#ifdef CONFIG_PREEMPT_RT ++ struct zsmalloc_handle *zh = zs_get_pure_handle(handle); ++ ++ WRITE_ONCE(zh->addr, obj); ++#else + /* + * lsb of @obj represents handle lock while other bits + * represent object value the handle is pointing so + * updating shouldn't do store tearing. + */ + WRITE_ONCE(*(unsigned long *)handle, obj); ++#endif + } + + /* zpool driver */ +@@ -455,7 +494,10 @@ MODULE_ALIAS("zpool-zsmalloc"); + #endif /* CONFIG_ZPOOL */ + + /* per-cpu VM mapping areas for zspage accesses that cross page boundaries */ +-static DEFINE_PER_CPU(struct mapping_area, zs_map_area); ++static DEFINE_PER_CPU(struct mapping_area, zs_map_area) = { ++ /* XXX remove this and use a spin_lock_t in pin_tag() */ ++ .lock = INIT_LOCAL_LOCK(lock), ++}; + + static bool is_zspage_isolated(struct zspage *zspage) + { +@@ -865,7 +907,13 @@ static unsigned long location_to_obj(struct page *page, unsigned int obj_idx) + + static unsigned long handle_to_obj(unsigned long handle) + { ++#ifdef CONFIG_PREEMPT_RT ++ struct zsmalloc_handle *zh = zs_get_pure_handle(handle); ++ ++ return zh->addr; ++#else + return *(unsigned long *)handle; ++#endif + } + + static unsigned long obj_to_head(struct page *page, void *obj) +@@ -879,22 +927,46 @@ static unsigned long obj_to_head(struct page *page, void *obj) + + static inline int testpin_tag(unsigned long handle) + { ++#ifdef CONFIG_PREEMPT_RT ++ struct zsmalloc_handle *zh = zs_get_pure_handle(handle); ++ ++ return spin_is_locked(&zh->lock); ++#else + return bit_spin_is_locked(HANDLE_PIN_BIT, (unsigned long *)handle); ++#endif + } + + static inline int trypin_tag(unsigned long handle) + { ++#ifdef CONFIG_PREEMPT_RT ++ struct zsmalloc_handle *zh = zs_get_pure_handle(handle); ++ ++ return spin_trylock(&zh->lock); ++#else + return bit_spin_trylock(HANDLE_PIN_BIT, (unsigned long *)handle); ++#endif + } + + static void pin_tag(unsigned long handle) __acquires(bitlock) + { ++#ifdef CONFIG_PREEMPT_RT ++ struct zsmalloc_handle *zh = zs_get_pure_handle(handle); ++ ++ return spin_lock(&zh->lock); ++#else + bit_spin_lock(HANDLE_PIN_BIT, (unsigned long *)handle); ++#endif + } + + static void unpin_tag(unsigned long handle) __releases(bitlock) + { ++#ifdef CONFIG_PREEMPT_RT ++ struct zsmalloc_handle *zh = zs_get_pure_handle(handle); ++ ++ return spin_unlock(&zh->lock); ++#else + bit_spin_unlock(HANDLE_PIN_BIT, (unsigned long *)handle); ++#endif + } + + static void reset_page(struct page *page) +@@ -1278,7 +1350,8 @@ void *zs_map_object(struct zs_pool *pool, unsigned long handle, + class = pool->size_class[class_idx]; + off = (class->size * obj_idx) & ~PAGE_MASK; + +- area = &get_cpu_var(zs_map_area); ++ local_lock(&zs_map_area.lock); ++ area = this_cpu_ptr(&zs_map_area); + area->vm_mm = mm; + if (off + class->size <= PAGE_SIZE) { + /* this object is contained entirely within a page */ +@@ -1332,7 +1405,7 @@ void zs_unmap_object(struct zs_pool *pool, unsigned long handle) + + __zs_unmap_object(area, pages, off, class->size); + } +- put_cpu_var(zs_map_area); ++ local_unlock(&zs_map_area.lock); + + migrate_read_unlock(zspage); + unpin_tag(handle); +diff --git a/net/Kconfig b/net/Kconfig +index d6567162c..05b0f041f 100644 +--- a/net/Kconfig ++++ b/net/Kconfig +@@ -282,7 +282,7 @@ config CGROUP_NET_CLASSID + + config NET_RX_BUSY_POLL + bool +- default y ++ default y if !PREEMPT_RT + + config BQL + bool +diff --git a/net/core/dev.c b/net/core/dev.c +index b54a4158e..c4fb1abf6 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -221,14 +221,14 @@ static inline struct hlist_head *dev_index_hash(struct net *net, int ifindex) + static inline void rps_lock(struct softnet_data *sd) + { + #ifdef CONFIG_RPS +- spin_lock(&sd->input_pkt_queue.lock); ++ raw_spin_lock(&sd->input_pkt_queue.raw_lock); + #endif + } + + static inline void rps_unlock(struct softnet_data *sd) + { + #ifdef CONFIG_RPS +- spin_unlock(&sd->input_pkt_queue.lock); ++ raw_spin_unlock(&sd->input_pkt_queue.raw_lock); + #endif + } + +@@ -3050,6 +3050,7 @@ static void __netif_reschedule(struct Qdisc *q) + sd->output_queue_tailp = &q->next_sched; + raise_softirq_irqoff(NET_TX_SOFTIRQ); + local_irq_restore(flags); ++ preempt_check_resched_rt(); + } + + void __netif_schedule(struct Qdisc *q) +@@ -3112,6 +3113,7 @@ void __dev_kfree_skb_irq(struct sk_buff *skb, enum skb_free_reason reason) + __this_cpu_write(softnet_data.completion_queue, skb); + raise_softirq_irqoff(NET_TX_SOFTIRQ); + local_irq_restore(flags); ++ preempt_check_resched_rt(); + } + EXPORT_SYMBOL(__dev_kfree_skb_irq); + +@@ -3786,7 +3788,11 @@ static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q, + * This permits qdisc->running owner to get the lock more + * often and dequeue packets faster. + */ ++#ifdef CONFIG_PREEMPT_RT ++ contended = true; ++#else + contended = qdisc_is_running(q); ++#endif + if (unlikely(contended)) + spin_lock(&q->busylock); + +@@ -4585,6 +4591,7 @@ static int enqueue_to_backlog(struct sk_buff *skb, int cpu, + rps_unlock(sd); + + local_irq_restore(flags); ++ preempt_check_resched_rt(); + + atomic_long_inc(&skb->dev->rx_dropped); + kfree_skb(skb); +@@ -4800,7 +4807,7 @@ static int netif_rx_internal(struct sk_buff *skb) + struct rps_dev_flow voidflow, *rflow = &voidflow; + int cpu; + +- preempt_disable(); ++ migrate_disable(); + rcu_read_lock(); + + cpu = get_rps_cpu(skb->dev, skb, &rflow); +@@ -4810,14 +4817,14 @@ static int netif_rx_internal(struct sk_buff *skb) + ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail); + + rcu_read_unlock(); +- preempt_enable(); ++ migrate_enable(); + } else + #endif + { + unsigned int qtail; + +- ret = enqueue_to_backlog(skb, get_cpu(), &qtail); +- put_cpu(); ++ ret = enqueue_to_backlog(skb, get_cpu_light(), &qtail); ++ put_cpu_light(); + } + return ret; + } +@@ -4856,11 +4863,9 @@ int netif_rx_ni(struct sk_buff *skb) + + trace_netif_rx_ni_entry(skb); + +- preempt_disable(); ++ local_bh_disable(); + err = netif_rx_internal(skb); +- if (local_softirq_pending()) +- do_softirq(); +- preempt_enable(); ++ local_bh_enable(); + trace_netif_rx_ni_exit(err); + + return err; +@@ -6336,12 +6341,14 @@ static void net_rps_action_and_irq_enable(struct softnet_data *sd) + sd->rps_ipi_list = NULL; + + local_irq_enable(); ++ preempt_check_resched_rt(); + + /* Send pending IPI's to kick RPS processing on remote cpus. */ + net_rps_send_ipi(remsd); + } else + #endif + local_irq_enable(); ++ preempt_check_resched_rt(); + } + + static bool sd_has_rps_ipi_waiting(struct softnet_data *sd) +@@ -6419,6 +6426,7 @@ void __napi_schedule(struct napi_struct *n) + local_irq_save(flags); + ____napi_schedule(this_cpu_ptr(&softnet_data), n); + local_irq_restore(flags); ++ preempt_check_resched_rt(); + } + EXPORT_SYMBOL(__napi_schedule); + +@@ -10975,6 +10983,7 @@ static int dev_cpu_dead(unsigned int oldcpu) + + raise_softirq_irqoff(NET_TX_SOFTIRQ); + local_irq_enable(); ++ preempt_check_resched_rt(); + + #ifdef CONFIG_RPS + remsd = oldsd->rps_ipi_list; +@@ -10988,7 +10997,7 @@ static int dev_cpu_dead(unsigned int oldcpu) + netif_rx_ni(skb); + input_queue_head_incr(oldsd); + } +- while ((skb = skb_dequeue(&oldsd->input_pkt_queue))) { ++ while ((skb = __skb_dequeue(&oldsd->input_pkt_queue))) { + netif_rx_ni(skb); + input_queue_head_incr(oldsd); + } +@@ -11304,7 +11313,7 @@ static int __init net_dev_init(void) + + INIT_WORK(flush, flush_backlog); + +- skb_queue_head_init(&sd->input_pkt_queue); ++ skb_queue_head_init_raw(&sd->input_pkt_queue); + skb_queue_head_init(&sd->process_queue); + #ifdef CONFIG_XFRM_OFFLOAD + skb_queue_head_init(&sd->xfrm_backlog); +diff --git a/net/core/gen_estimator.c b/net/core/gen_estimator.c +index 8e582e29a..e51f4854d 100644 +--- a/net/core/gen_estimator.c ++++ b/net/core/gen_estimator.c +@@ -42,7 +42,7 @@ + struct net_rate_estimator { + struct gnet_stats_basic_packed *bstats; + spinlock_t *stats_lock; +- seqcount_t *running; ++ net_seqlock_t *running; + struct gnet_stats_basic_cpu __percpu *cpu_bstats; + u8 ewma_log; + u8 intvl_log; /* period : (250ms << intvl_log) */ +@@ -125,7 +125,7 @@ int gen_new_estimator(struct gnet_stats_basic_packed *bstats, + struct gnet_stats_basic_cpu __percpu *cpu_bstats, + struct net_rate_estimator __rcu **rate_est, + spinlock_t *lock, +- seqcount_t *running, ++ net_seqlock_t *running, + struct nlattr *opt) + { + struct gnet_estimator *parm = nla_data(opt); +@@ -226,7 +226,7 @@ int gen_replace_estimator(struct gnet_stats_basic_packed *bstats, + struct gnet_stats_basic_cpu __percpu *cpu_bstats, + struct net_rate_estimator __rcu **rate_est, + spinlock_t *lock, +- seqcount_t *running, struct nlattr *opt) ++ net_seqlock_t *running, struct nlattr *opt) + { + return gen_new_estimator(bstats, cpu_bstats, rate_est, + lock, running, opt); +diff --git a/net/core/gen_stats.c b/net/core/gen_stats.c +index e491b083b..ef432cea2 100644 +--- a/net/core/gen_stats.c ++++ b/net/core/gen_stats.c +@@ -137,7 +137,7 @@ __gnet_stats_copy_basic_cpu(struct gnet_stats_basic_packed *bstats, + } + + void +-__gnet_stats_copy_basic(const seqcount_t *running, ++__gnet_stats_copy_basic(net_seqlock_t *running, + struct gnet_stats_basic_packed *bstats, + struct gnet_stats_basic_cpu __percpu *cpu, + struct gnet_stats_basic_packed *b) +@@ -150,15 +150,15 @@ __gnet_stats_copy_basic(const seqcount_t *running, + } + do { + if (running) +- seq = read_seqcount_begin(running); ++ seq = net_seq_begin(running); + bstats->bytes = b->bytes; + bstats->packets = b->packets; +- } while (running && read_seqcount_retry(running, seq)); ++ } while (running && net_seq_retry(running, seq)); + } + EXPORT_SYMBOL(__gnet_stats_copy_basic); + + static int +-___gnet_stats_copy_basic(const seqcount_t *running, ++___gnet_stats_copy_basic(net_seqlock_t *running, + struct gnet_dump *d, + struct gnet_stats_basic_cpu __percpu *cpu, + struct gnet_stats_basic_packed *b, +@@ -204,7 +204,7 @@ ___gnet_stats_copy_basic(const seqcount_t *running, + * if the room in the socket buffer was not sufficient. + */ + int +-gnet_stats_copy_basic(const seqcount_t *running, ++gnet_stats_copy_basic(net_seqlock_t *running, + struct gnet_dump *d, + struct gnet_stats_basic_cpu __percpu *cpu, + struct gnet_stats_basic_packed *b) +@@ -228,7 +228,7 @@ EXPORT_SYMBOL(gnet_stats_copy_basic); + * if the room in the socket buffer was not sufficient. + */ + int +-gnet_stats_copy_basic_hw(const seqcount_t *running, ++gnet_stats_copy_basic_hw(net_seqlock_t *running, + struct gnet_dump *d, + struct gnet_stats_basic_cpu __percpu *cpu, + struct gnet_stats_basic_packed *b) +diff --git a/net/core/sock.c b/net/core/sock.c +index bee3c320d..cfa687ba2 100644 +--- a/net/core/sock.c ++++ b/net/core/sock.c +@@ -3055,12 +3055,11 @@ void lock_sock_nested(struct sock *sk, int subclass) + if (sk->sk_lock.owned) + __lock_sock(sk); + sk->sk_lock.owned = 1; +- spin_unlock(&sk->sk_lock.slock); ++ spin_unlock_bh(&sk->sk_lock.slock); + /* + * The sk_lock has mutex_lock() semantics here: + */ + mutex_acquire(&sk->sk_lock.dep_map, subclass, 0, _RET_IP_); +- local_bh_enable(); + } + EXPORT_SYMBOL(lock_sock_nested); + +@@ -3109,12 +3108,11 @@ bool lock_sock_fast(struct sock *sk) + + __lock_sock(sk); + sk->sk_lock.owned = 1; +- spin_unlock(&sk->sk_lock.slock); ++ spin_unlock_bh(&sk->sk_lock.slock); + /* + * The sk_lock has mutex_lock() semantics here: + */ + mutex_acquire(&sk->sk_lock.dep_map, 0, 0, _RET_IP_); +- local_bh_enable(); + return true; + } + EXPORT_SYMBOL(lock_sock_fast); +diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c +index e093847c3..b8369afec 100644 +--- a/net/ipv4/inet_hashtables.c ++++ b/net/ipv4/inet_hashtables.c +@@ -637,7 +637,9 @@ int __inet_hash(struct sock *sk, struct sock *osk) + int err = 0; + + if (sk->sk_state != TCP_LISTEN) { ++ local_bh_disable(); + inet_ehash_nolisten(sk, osk, NULL); ++ local_bh_enable(); + return 0; + } + WARN_ON(!sk_unhashed(sk)); +@@ -669,11 +671,8 @@ int inet_hash(struct sock *sk) + { + int err = 0; + +- if (sk->sk_state != TCP_CLOSE) { +- local_bh_disable(); ++ if (sk->sk_state != TCP_CLOSE) + err = __inet_hash(sk, NULL); +- local_bh_enable(); +- } + + return err; + } +@@ -684,17 +683,20 @@ void inet_unhash(struct sock *sk) + struct inet_hashinfo *hashinfo = sk->sk_prot->h.hashinfo; + struct inet_listen_hashbucket *ilb = NULL; + spinlock_t *lock; ++ bool state_listen; + + if (sk_unhashed(sk)) + return; + + if (sk->sk_state == TCP_LISTEN) { ++ state_listen = true; + ilb = &hashinfo->listening_hash[inet_sk_listen_hashfn(sk)]; +- lock = &ilb->lock; ++ spin_lock(&ilb->lock); + } else { ++ state_listen = false; + lock = inet_ehash_lockp(hashinfo, sk->sk_hash); ++ spin_lock_bh(lock); + } +- spin_lock_bh(lock); + if (sk_unhashed(sk)) + goto unlock; + +@@ -707,7 +709,10 @@ void inet_unhash(struct sock *sk) + __sk_nulls_del_node_init_rcu(sk); + sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); + unlock: +- spin_unlock_bh(lock); ++ if (state_listen) ++ spin_unlock(&ilb->lock); ++ else ++ spin_unlock_bh(lock); + } + EXPORT_SYMBOL_GPL(inet_unhash); + +diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c +index 67c911483..0a2e7f228 100644 +--- a/net/ipv6/inet6_hashtables.c ++++ b/net/ipv6/inet6_hashtables.c +@@ -333,11 +333,8 @@ int inet6_hash(struct sock *sk) + { + int err = 0; + +- if (sk->sk_state != TCP_CLOSE) { +- local_bh_disable(); ++ if (sk->sk_state != TCP_CLOSE) + err = __inet_hash(sk, NULL); +- local_bh_enable(); +- } + + return err; + } +diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c +index 7b24582a8..99390f262 100644 +--- a/net/sched/sch_api.c ++++ b/net/sched/sch_api.c +@@ -1264,7 +1264,7 @@ static struct Qdisc *qdisc_create(struct net_device *dev, + rcu_assign_pointer(sch->stab, stab); + } + if (tca[TCA_RATE]) { +- seqcount_t *running; ++ net_seqlock_t *running; + + err = -EOPNOTSUPP; + if (sch->flags & TCQ_F_MQROOT) { +diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c +index 6a9c1a398..2d2344d30 100644 +--- a/net/sched/sch_generic.c ++++ b/net/sched/sch_generic.c +@@ -578,7 +578,11 @@ struct Qdisc noop_qdisc = { + .ops = &noop_qdisc_ops, + .q.lock = __SPIN_LOCK_UNLOCKED(noop_qdisc.q.lock), + .dev_queue = &noop_netdev_queue, ++#ifdef CONFIG_PREEMPT_RT ++ .running = __SEQLOCK_UNLOCKED(noop_qdisc.running), ++#else + .running = SEQCNT_ZERO(noop_qdisc.running), ++#endif + .busylock = __SPIN_LOCK_UNLOCKED(noop_qdisc.busylock), + .gso_skb = { + .next = (struct sk_buff *)&noop_qdisc.gso_skb, +@@ -889,9 +893,15 @@ struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue, + lockdep_set_class(&sch->seqlock, + dev->qdisc_tx_busylock ?: &qdisc_tx_busylock); + ++#ifdef CONFIG_PREEMPT_RT ++ seqlock_init(&sch->running); ++ lockdep_set_class(&sch->running.lock, ++ dev->qdisc_running_key ?: &qdisc_running_key); ++#else + seqcount_init(&sch->running); + lockdep_set_class(&sch->running, + dev->qdisc_running_key ?: &qdisc_running_key); ++#endif + + sch->ops = ops; + sch->flags = ops->static_flags; +diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c +index 362487f3a..5c6c31fc7 100644 +--- a/net/sunrpc/svc_xprt.c ++++ b/net/sunrpc/svc_xprt.c +@@ -422,7 +422,7 @@ void svc_xprt_do_enqueue(struct svc_xprt *xprt) + if (test_and_set_bit(XPT_BUSY, &xprt->xpt_flags)) + return; + +- cpu = get_cpu(); ++ cpu = get_cpu_light(); + pool = svc_pool_for_cpu(xprt->xpt_server, cpu); + + atomic_long_inc(&pool->sp_stats.packets); +@@ -446,7 +446,7 @@ void svc_xprt_do_enqueue(struct svc_xprt *xprt) + rqstp = NULL; + out_unlock: + rcu_read_unlock(); +- put_cpu(); ++ put_cpu_light(); + trace_svc_xprt_do_enqueue(xprt, rqstp); + } + EXPORT_SYMBOL_GPL(svc_xprt_do_enqueue); +diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c +index c158e70e8..ca93d225d 100644 +--- a/net/xfrm/xfrm_state.c ++++ b/net/xfrm/xfrm_state.c +@@ -2673,7 +2673,8 @@ int __net_init xfrm_state_init(struct net *net) + net->xfrm.state_num = 0; + INIT_WORK(&net->xfrm.state_hash_work, xfrm_hash_resize); + spin_lock_init(&net->xfrm.xfrm_state_lock); +- seqcount_init(&net->xfrm.xfrm_state_hash_generation); ++ seqcount_spinlock_init(&net->xfrm.xfrm_state_hash_generation, ++ &net->xfrm.xfrm_state_lock); + return 0; + + out_byspi: diff --git a/0001-modify-openeuler_defconfig-for-rt62.patch b/0001-modify-openeuler_defconfig-for-rt62.patch new file mode 100644 index 00000000..1e610361 --- /dev/null +++ b/0001-modify-openeuler_defconfig-for-rt62.patch @@ -0,0 +1,145 @@ +diff --git a/arch/arm64/configs/openeuler_defconfig b/arch/arm64/configs/openeuler_defconfig +index 770222a59..cb1eb235d 100644 +--- a/arch/arm64/configs/openeuler_defconfig ++++ b/arch/arm64/configs/openeuler_defconfig +@@ -73,6 +73,7 @@ CONFIG_HIGH_RES_TIMERS=y + CONFIG_PREEMPT_NONE=y + # CONFIG_PREEMPT_VOLUNTARY is not set + # CONFIG_PREEMPT is not set ++CONFIG_PREEMPT_RT=y + + # + # CPU/Task time and stats accounting +@@ -724,7 +725,7 @@ CONFIG_ACPI_MPAM=y + CONFIG_ACPI_PPTT=y + # CONFIG_PMIC_OPREGION is not set + CONFIG_IRQ_BYPASS_MANAGER=y +-CONFIG_VIRTUALIZATION=y ++# CONFIG_VIRTUALIZATION is not set + CONFIG_KVM=y + CONFIG_HAVE_KVM_IRQCHIP=y + CONFIG_HAVE_KVM_IRQFD=y +@@ -1106,7 +1107,7 @@ CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y + # CONFIG_GUP_BENCHMARK is not set + # CONFIG_READ_ONLY_THP_FOR_FS is not set + CONFIG_ARCH_HAS_PTE_SPECIAL=y +-CONFIG_PIN_MEMORY=y ++# CONFIG_PIN_MEMORY is not set + CONFIG_PID_RESERVE=y + CONFIG_MEMORY_RELIABLE=y + +diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c +index 84520f116..aa631771e 100644 +--- a/arch/arm64/kernel/fpsimd.c ++++ b/arch/arm64/kernel/fpsimd.c +@@ -180,7 +180,7 @@ static void __get_cpu_fpsimd_context(void) + */ + static void get_cpu_fpsimd_context(void) + { +- local_bh_disable(); ++ preempt_disable(); + __get_cpu_fpsimd_context(); + } + +@@ -201,7 +201,7 @@ static void __put_cpu_fpsimd_context(void) + static void put_cpu_fpsimd_context(void) + { + __put_cpu_fpsimd_context(); +- local_bh_enable(); ++ preempt_enable(); + } + + static bool have_cpu_fpsimd_context(void) +diff --git a/arch/x86/configs/openeuler_defconfig b/arch/x86/configs/openeuler_defconfig +index 926dfe062..8da3fe557 100644 +--- a/arch/x86/configs/openeuler_defconfig ++++ b/arch/x86/configs/openeuler_defconfig +@@ -88,9 +88,10 @@ CONFIG_NO_HZ=y + CONFIG_HIGH_RES_TIMERS=y + # end of Timers subsystem + +-CONFIG_PREEMPT_NONE=y ++# CONFIG_PREEMPT_NONE is not set + # CONFIG_PREEMPT_VOLUNTARY is not set + # CONFIG_PREEMPT is not set ++CONFIG_PREEMPT_RT=y + + # + # CPU/Task time and stats accounting +@@ -204,7 +205,7 @@ CONFIG_HAVE_UID16=y + CONFIG_SYSCTL_EXCEPTION_TRACE=y + CONFIG_HAVE_PCSPKR_PLATFORM=y + CONFIG_BPF=y +-# CONFIG_EXPERT is not set ++CONFIG_EXPERT=y + CONFIG_UID16=y + CONFIG_MULTIUSER=y + CONFIG_SGETMASK_SYSCALL=y +@@ -723,7 +724,7 @@ CONFIG_KVM_COMPAT=y + CONFIG_HAVE_KVM_IRQ_BYPASS=y + CONFIG_HAVE_KVM_NO_POLL=y + CONFIG_KVM_XFER_TO_GUEST_WORK=y +-CONFIG_VIRTUALIZATION=y ++# CONFIG_VIRTUALIZATION is not set + CONFIG_KVM=m + CONFIG_KVM_INTEL=m + CONFIG_KVM_AMD=m +diff --git a/arch/x86/include/asm/preempt.h b/arch/x86/include/asm/preempt.h +index a3b73de27..dda9ec24f 100644 +--- a/arch/x86/include/asm/preempt.h ++++ b/arch/x86/include/asm/preempt.h +@@ -134,10 +134,8 @@ static __always_inline bool should_resched(int preempt_offset) + #endif + } + ++#ifndef CONFIG_PREEMPT_RT + #ifdef CONFIG_PREEMPTION +-#ifdef CONFIG_PREEMPT_RT +- extern void preempt_schedule_lock(void); +-#endif + extern asmlinkage void preempt_schedule(void); + extern asmlinkage void preempt_schedule_thunk(void); + +@@ -166,4 +164,16 @@ do { \ + + #endif + ++#else ++#ifdef CONFIG_PREEMPTION ++#ifdef CONFIG_PREEMPT_RT ++extern void preempt_schedule_lock(void); ++#endif ++extern asmlinkage void preempt_schedule(void); ++#define __preempt_schedule() preempt_schedule() ++extern asmlinkage void preempt_schedule_notrace(void); ++#define __preempt_schedule_notrace() preempt_schedule_notrace() ++#endif /* CONFIG_PREEMPTION */ ++#endif ++ + #endif /* __ASM_PREEMPT_H */ +diff --git a/include/linux/printk.h b/include/linux/printk.h +index 9331b131b..23946f482 100644 +--- a/include/linux/printk.h ++++ b/include/linux/printk.h +@@ -241,7 +241,7 @@ __printf(1, 2) void dump_stack_set_arch_desc(const char *fmt, ...); + void dump_stack_print_info(const char *log_lvl); + void show_regs_print_info(const char *log_lvl); + extern asmlinkage void dump_stack(void) __cold; +-#if defined(CONFIG_X86) || defined(CONFIG_ARM64_PSEUDO_NMI) ++#if (defined(CONFIG_X86) || defined(CONFIG_ARM64_PSEUDO_NMI)) && !defined(CONFIG_PREEMPT_RT) + extern void zap_locks(void); + #else + static inline void zap_locks(void) { } +diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c +index eeeb590e1..d6fc0ae57 100644 +--- a/kernel/printk/printk.c ++++ b/kernel/printk/printk.c +@@ -1811,7 +1811,7 @@ static void print_sync_until(struct console *con, u64 seq) + console_atomic_unlock(flags); + } + +-#if defined(CONFIG_X86) || defined(CONFIG_ARM64_PSEUDO_NMI) ++#if (defined(CONFIG_X86) || defined(CONFIG_ARM64_PSEUDO_NMI)) && !defined(CONFIG_PREEMPT_RT) + void zap_locks(void) + { + if (raw_spin_is_locked(&logbuf_lock)) { diff --git a/_multibuild b/_multibuild index 01794d81..7938bc7e 100644 --- a/_multibuild +++ b/_multibuild @@ -1,3 +1,4 @@ raspberrypi-kernel - \ No newline at end of file + kernel-rt + diff --git a/kernel-rt.spec b/kernel-rt.spec new file mode 100644 index 00000000..7cf25db4 --- /dev/null +++ b/kernel-rt.spec @@ -0,0 +1,15655 @@ +%define with_signmodules 1 +%define with_kabichk 0 + +%define modsign_cmd %{SOURCE10} + +%global Arch $(echo %{_host_cpu} | sed -e s/i.86/x86/ -e s/x86_64/x86/ -e s/aarch64.*/arm64/) + +%global KernelVer %{version}-%{release}.%{_target_cpu} +%global debuginfodir /usr/lib/debug + +%global upstream_version 5.10 +%global upstream_sublevel 0 +%global devel_release 83 +%global maintenance_release .0.0 +%global pkg_release .40 +%global rt_release .rt62 + +%define with_debuginfo 1 +# Do not recompute the build-id of vmlinux in find-debuginfo.sh +%global _missing_build_ids_terminate_build 1 +%global _no_recompute_build_ids 1 +%undefine _include_minidebuginfo +%undefine _include_gdb_index +%undefine _unique_build_ids + +%define with_source 1 + +%define with_python2 0 + +# failed if there is new config options +%define listnewconfig_fail 0 + +%ifarch aarch64 +%define with_64kb %{?_with_64kb: 1} %{?!_with_64kb: 0} +%if %{with_64kb} +%global package64kb -64kb +%endif +%else +%define with_64kb 0 +%endif + +#default is enabled. You can disable it with --without option +%define with_perf %{?_without_perf: 0} %{?!_without_perf: 1} + +Name: kernel-rt%{?package64kb} +Version: %{upstream_version}.%{upstream_sublevel} +Release: %{devel_release}%{?maintenance_release}%{?rt_release}%{?pkg_release}%{?extra_release} +Summary: Linux Kernel +License: GPLv2 +URL: http://www.kernel.org/ +Source0: kernel.tar.gz +Source10: sign-modules +Source11: x509.genkey +Source12: extra_certificates +Source13: pubring.gpg + +%if 0%{?with_kabichk} +Source18: check-kabi +Source20: Module.kabi_aarch64 +%endif + +Source200: mkgrub-menu-aarch64.sh + +Source2000: cpupower.service +Source2001: cpupower.config + +%if 0%{?with_patch} +Source9000: apply-patches +Source9001: guards +Source9002: series.conf +Source9998: patches.tar.bz2 +%endif + +Patch0: 0000-kernel-5.10.0-83.0.0-rt62.patch +Patch1: 0001-modify-openeuler_defconfig-for-rt62.patch + +#BuildRequires: +BuildRequires: module-init-tools, patch >= 2.5.4, bash >= 2.03, tar +BuildRequires: bzip2, xz, findutils, gzip, m4, perl, make >= 3.78, diffutils, gawk +BuildRequires: libcap-devel, libcap-ng-devel, rsync +BuildRequires: gcc >= 3.4.2, binutils >= 2.12 +BuildRequires: hostname, net-tools, bc +BuildRequires: xmlto, asciidoc +BuildRequires: openssl-devel openssl +BuildRequires: hmaccalc +BuildRequires: ncurses-devel +#BuildRequires: pesign >= 0.109-4 +BuildRequires: elfutils-libelf-devel +BuildRequires: rpm >= 4.14.2 +#BuildRequires: sparse >= 0.4.1 +%if 0%{?with_python2} +BuildRequires: python-devel +%endif + +BuildRequires: elfutils-devel zlib-devel binutils-devel newt-devel perl(ExtUtils::Embed) bison +BuildRequires: audit-libs-devel +BuildRequires: pciutils-devel gettext +BuildRequires: rpm-build, elfutils +BuildRequires: numactl-devel python3-devel glibc-static python3-docutils +BuildRequires: perl-generators perl(Carp) libunwind-devel gtk2-devel libbabeltrace-devel java-1.8.0-openjdk perl-devel +AutoReq: no +AutoProv: yes + +Conflicts: device-mapper-libs < 1.02.63-2 e2fsprogs < 1.37-4 initscripts < 7.23 iptables < 1.3.2-1 +Conflicts: ipw2200-firmware < 2.4 isdn4k-utils < 3.2-32 iwl4965-firmware < 228.57.2 jfsutils < 1.1.7-2 +Conflicts: mdadm < 3.2.1-5 nfs-utils < 1.0.7-12 oprofile < 0.9.1-2 ppp < 2.4.3-3 procps < 3.2.5-6.3 +Conflicts: reiserfs-utils < 3.6.19-2 selinux-policy-targeted < 1.25.3-14 squashfs-tools < 4.0 +Conflicts: udev < 063-6 util-linux < 2.12 wireless-tools < 29-3 xfsprogs < 2.6.13-4 + +Provides: kernel-rt-aarch64 = %{version}-%{release} kernel-rt-drm = 4.3.0 kernel-rt-drm-nouveau = 16 kernel-rt-modeset = 1 +Provides: kernel-rt-uname-r = %{KernelVer} kernel-rt=%{KernelVer} + +Requires: dracut >= 001-7 grubby >= 8.28-2 initscripts >= 8.11.1-1 linux-firmware >= 20100806-2 module-init-tools >= 3.16-2 + +ExclusiveArch: noarch aarch64 i686 x86_64 +ExclusiveOS: Linux + +%if %{with_perf} +BuildRequires: flex xz-devel libzstd-devel +BuildRequires: java-devel +%endif + +BuildRequires: dwarves +BuildRequires: clang >= 10.0.0 +BuildRequires: llvm + +%description +The Linux Kernel, the operating system core itself. + +%package headers +Summary: Header files for the Linux kernel for use by glibc +Obsoletes: glibc-kernheaders < 3.0-46 +Provides: glibc-kernheaders = 3.0-46 +%description headers +Kernel-headers includes the C header files that specify the interface +between the Linux kernel and userspace libraries and programs. The +header files define structures and constants that are needed for +building most standard programs and are also needed for rebuilding the +glibc package. + + +%package devel +Summary: Development package for building kernel modules to match the %{KernelVer} kernel +AutoReqProv: no +Provides: kernel-rt-devel-uname-r = %{KernelVer} +Provides: kernel-rt-devel-%{_target_cpu} = %{version}-%{release} +Requires: perl findutils + +%description devel +This package provides kernel headers and makefiles sufficient to build modules +against the %{KernelVer} kernel package. + +%package tools +Summary: Assortment of tools for the Linux kernel +Provides: %{name}-tools-libs +Obsoletes: %{name}-tools-libs +Provides: cpufreq-utils = 1:009-0.6.p1 +Provides: cpufrequtils = 1:009-0.6.p1 +Obsoletes: cpufreq-utils < 1:009-0.6.p1 +Obsoletes: cpufrequtils < 1:009-0.6.p1 +Obsoletes: cpuspeed < 1:1.5-16 +%description tools +This package contains the tools/ directory from the kernel source +and the supporting documentation. + +%package tools-devel +Summary: Assortment of tools for the Linux kernel +Requires: %{name}-tools = %{version}-%{release} +Requires: %{name}-tools-libs = %{version}-%{release} +Provides: %{name}-tools-libs-devel = %{version}-%{release} +Obsoletes: %{name}-tools-libs-devel +%description tools-devel +This package contains the development files for the tools/ directory from +the kernel source. + +%if %{with_perf} +%package -n perf +Summary: Performance monitoring for the Linux kernel +%description -n perf +This package contains the perf tool, which enables performance monitoring +of the Linux kernel. + +%if 0%{?with_python2} +%package -n python2-perf +Provides: python-perf = %{version}-%{release} +Obsoletes: python-perf +Summary: Python bindings for apps which will manipulate perf events + +%description -n python2-perf +A Python module that permits applications written in the Python programming +language to use the interface to manipulate perf events. +%endif + +%package -n python3-perf +Summary: Python bindings for apps which will manipulate perf events +%description -n python3-perf +A Python module that permits applications written in the Python programming +language to use the interface to manipulate perf events. +# with_perf +%endif + +%package -n bpftool +Summary: Inspection and simple manipulation of eBPF programs and maps +%description -n bpftool +This package contains the bpftool, which allows inspection and simple +manipulation of eBPF programs and maps. + +%package source +Summary: the kernel source +%description source +This package contains vaious source files from the kernel. + +%if 0%{?with_debuginfo} +%define _debuginfo_template %{nil} +%define _debuginfo_subpackages 0 + +%define debuginfo_template(n:) \ +%package -n %{-n*}-debuginfo\ +Summary: Debug information for package %{-n*}\ +Group: Development/Debug\ +AutoReq: 0\ +AutoProv: 1\ +%description -n %{-n*}-debuginfo\ +This package provides debug information for package %{-n*}.\ +Debug information is useful when developing applications that use this\ +package or when debugging this package.\ +%{nil} + +%debuginfo_template -n kernel-rt +%files -n kernel-rt-debuginfo -f debugfiles.list + +%debuginfo_template -n bpftool +%files -n bpftool-debuginfo -f bpftool-debugfiles.list +%{expand:%%global _find_debuginfo_opts %{?_find_debuginfo_opts} -p '.*%{_sbindir}/bpftool.*(\.debug)?|XXX' -o bpftool-debugfiles.list} + +%debuginfo_template -n kernel-rt-tools +%files -n kernel-rt-tools-debuginfo -f kernel-tools-debugfiles.list +%{expand:%%global _find_debuginfo_opts %{?_find_debuginfo_opts} -p '.*%{_bindir}/centrino-decode.*(\.debug)?|.*%{_bindir}/powernow-k8-decode.*(\.debug)?|.*%{_bindir}/cpupower.*(\.debug)?|.*%{_libdir}/libcpupower.*|.*%{_libdir}/libcpupower.*|.*%{_bindir}/turbostat.(\.debug)?|.*%{_bindir}/.*gpio.*(\.debug)?|.*%{_bindir}/.*iio.*(\.debug)?|.*%{_bindir}/tmon.*(.debug)?|XXX' -o kernel-tools-debugfiles.list} + +%if %{with_perf} +%debuginfo_template -n perf +%files -n perf-debuginfo -f perf-debugfiles.list +%{expand:%%global _find_debuginfo_opts %{?_find_debuginfo_opts} -p '.*%{_bindir}/perf.*(\.debug)?|.*%{_libexecdir}/perf-core/.*|.*%{_libdir}/traceevent/.*|XXX' -o perf-debugfiles.list} + +%if 0%{?with_python2} +%debuginfo_template -n python2-perf +%files -n python2-perf-debuginfo -f python2-perf-debugfiles.list +%{expand:%%global _find_debuginfo_opts %{?_find_debuginfo_opts} -p '.*%{python2_sitearch}/perf.*(.debug)?|XXX' -o python2-perf-debugfiles.list} +%endif + +%debuginfo_template -n python3-perf +%files -n python3-perf-debuginfo -f python3-perf-debugfiles.list +%{expand:%%global _find_debuginfo_opts %{?_find_debuginfo_opts} -p '.*%{python3_sitearch}/perf.*(.debug)?|XXX' -o python3-perf-debugfiles.list} +#with_perf +%endif + +%endif + +%prep + +%setup -q -n kernel-%{version} -c + +%if 0%{?with_patch} +tar -xjf %{SOURCE9998} +%endif + +mv kernel linux-%{KernelVer} +cd linux-%{KernelVer} + +cp %{SOURCE13} certs + +%if 0%{?with_patch} +cp %{SOURCE9000} . +cp %{SOURCE9001} . +cp %{SOURCE9002} . + +if [ ! -d patches ];then + mv ../patches . +fi + +Applypatches() +{ + set -e + set -o pipefail + local SERIESCONF=$1 + local PATCH_DIR=$2 + sed -i '/^#/d' $SERIESCONF + sed -i '/^[\s]*$/d' $SERIESCONF + ( + echo "trap 'echo \"*** patch \$_ failed ***\"' ERR" + echo "set -ex" + cat $SERIESCONF | \ + sed "s!^!patch -s -F0 -E -p1 --no-backup-if-mismatch -i $PATCH_DIR/!" \ + ) | sh +} + +Applypatches series.conf %{_builddir}/kernel-%{version}/linux-%{KernelVer} +%endif + +%patch0 -p1 +%patch1 -p1 + +touch .scmversion + +find . \( -name "*.orig" -o -name "*~" \) -exec rm -f {} \; >/dev/null +find . -name .gitignore -exec rm -f {} \; >/dev/null + +%if 0%{?with_signmodules} + cp %{SOURCE11} certs/. +%endif + +pathfix.py -pni "/usr/bin/python" tools/power/pm-graph/sleepgraph.py tools/power/pm-graph/bootgraph.py tools/perf/scripts/python/exported-sql-viewer.py + +%if 0%{?with_source} +# Copy directory backup for kernel-source +cp -a ../linux-%{KernelVer} ../linux-%{KernelVer}-source +find ../linux-%{KernelVer}-source -type f -name "\.*" -exec rm -rf {} \; >/dev/null +%endif + +cp -a tools/perf tools/python3-perf + +%build +cd linux-%{KernelVer} + +perl -p -i -e "s/^EXTRAVERSION.*/EXTRAVERSION = -%{release}.%{_target_cpu}/" Makefile + +## make linux +make mrproper %{_smp_mflags} + +%if %{with_64kb} +sed -i arch/arm64/configs/openeuler_defconfig -e 's/^CONFIG_ARM64_4K_PAGES.*/CONFIG_ARM64_64K_PAGES=y/' +sed -i arch/arm64/configs/openeuler_defconfig -e 's/^CONFIG_ARM64_PA_BITS=.*/CONFIG_ARM64_PA_BITS=52/' +sed -i arch/arm64/configs/openeuler_defconfig -e 's/^CONFIG_ARM64_PA_BITS_.*/CONFIG_ARM64_PA_BITS_52=y/' +sed -i arch/arm64/configs/openeuler_defconfig -e 's/^CONFIG_ARM64_VA_BITS=.*/CONFIG_ARM64_VA_BITS=52/' +sed -i arch/arm64/configs/openeuler_defconfig -e 's/^CONFIG_ARM64_VA_BITS_.*/CONFIG_ARM64_VA_BITS_52=y/' +%endif + +make ARCH=%{Arch} openeuler_defconfig + +TargetImage=$(basename $(make -s image_name)) + +make ARCH=%{Arch} $TargetImage %{?_smp_mflags} +make ARCH=%{Arch} modules %{?_smp_mflags} + +%if 0%{?with_kabichk} + chmod 0755 %{SOURCE18} + if [ -e $RPM_SOURCE_DIR/Module.kabi_%{_target_cpu} ]; then + ##%{SOURCE18} -k $RPM_SOURCE_DIR/Module.kabi_%{_target_cpu} -s Module.symvers || exit 1 + echo "**** NOTE: now don't check Kabi. ****" + else + echo "**** NOTE: Cannot find reference Module.kabi file. ****" + fi +%endif + +# aarch64 make dtbs +%ifarch aarch64 + make ARCH=%{Arch} dtbs +%endif + +## make tools +%if %{with_perf} +# perf +%global perf_make \ + make EXTRA_CFLAGS="-Wl,-z,now -g -Wall -fstack-protector-strong -fPIC" EXTRA_PERFLIBS="-fpie -pie" %{?_smp_mflags} -s V=1 WERROR=0 NO_LIBUNWIND=1 HAVE_CPLUS_DEMANGLE=1 NO_GTK2=1 NO_LIBNUMA=1 NO_STRLCPY=1 prefix=%{_prefix} +%if 0%{?with_python2} +%global perf_python2 -C tools/perf PYTHON=%{__python2} +%global perf_python3 -C tools/python3-perf PYTHON=%{__python3} +%else +%global perf_python3 -C tools/perf PYTHON=%{__python3} +%endif + +chmod +x tools/perf/check-headers.sh +# perf +%if 0%{?with_python2} +%{perf_make} %{perf_python2} all +%endif + +# make sure check-headers.sh is executable +chmod +x tools/python3-perf/check-headers.sh +%{perf_make} %{perf_python3} all + +pushd tools/perf/Documentation/ +make %{?_smp_mflags} man +popd +%endif + +# bpftool +pushd tools/bpf/bpftool +make +popd + +# cpupower +chmod +x tools/power/cpupower/utils/version-gen.sh +make %{?_smp_mflags} -C tools/power/cpupower CPUFREQ_BENCH=false +%ifarch %{ix86} + pushd tools/power/cpupower/debug/i386 + make %{?_smp_mflags} centrino-decode powernow-k8-decode + popd +%endif +%ifarch x86_64 + pushd tools/power/cpupower/debug/x86_64 + make %{?_smp_mflags} centrino-decode powernow-k8-decode + popd +%endif +%ifarch %{ix86} x86_64 + pushd tools/power/x86/x86_energy_perf_policy/ + make + popd + pushd tools/power/x86/turbostat + make + popd +%endif +# thermal +pushd tools/thermal/tmon/ +make +popd +# iio +pushd tools/iio/ +make +popd +# gpio +pushd tools/gpio/ +make +popd +# kvm +pushd tools/kvm/kvm_stat/ +make %{?_smp_mflags} man +popd + +%install +%if 0%{?with_source} + %define _python_bytecompile_errors_terminate_build 0 + mkdir -p $RPM_BUILD_ROOT/usr/src/ + mv linux-%{KernelVer}-source $RPM_BUILD_ROOT/usr/src/linux-%{KernelVer} + cp linux-%{KernelVer}/.config $RPM_BUILD_ROOT/usr/src/linux-%{KernelVer}/ + cp linux-%{KernelVer}/.scmversion $RPM_BUILD_ROOT/usr/src/linux-%{KernelVer}/ +%endif + +cd linux-%{KernelVer} + +## install linux + +# deal with kernel-source, now we don't need kernel-source +#mkdir $RPM_BUILD_ROOT/usr/src/linux-%{KernelVer} +#tar cf - --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CVS --exclude .pc --exclude .hg --exclude .git --exclude=.tmp_versions --exclude=*vmlinux* --exclude=*.o --exclude=*.ko --exclude=*.cmd --exclude=Documentation --exclude=.config.old --exclude=.missing-syscalls.d --exclude=patches . | tar xf - -C %{buildroot}/usr/src/linux-%{KernelVer} + +mkdir -p $RPM_BUILD_ROOT/boot +dd if=/dev/zero of=$RPM_BUILD_ROOT/boot/initramfs-%{KernelVer}.img bs=1M count=20 + +install -m 755 $(make -s image_name) $RPM_BUILD_ROOT/boot/vmlinuz-%{KernelVer} +pushd $RPM_BUILD_ROOT/boot +sha512hmac ./vmlinuz-%{KernelVer} >./.vmlinuz-%{KernelVer}.hmac +popd + +install -m 644 .config $RPM_BUILD_ROOT/boot/config-%{KernelVer} +install -m 644 System.map $RPM_BUILD_ROOT/boot/System.map-%{KernelVer} + +gzip -c9 < Module.symvers > $RPM_BUILD_ROOT/boot/symvers-%{KernelVer}.gz + +mkdir -p $RPM_BUILD_ROOT%{_sbindir} +install -m 755 %{SOURCE200} $RPM_BUILD_ROOT%{_sbindir}/mkgrub-menu-%{devel_release}.sh + + +%if 0%{?with_debuginfo} + mkdir -p $RPM_BUILD_ROOT%{debuginfodir}/lib/modules/%{KernelVer} + cp vmlinux $RPM_BUILD_ROOT%{debuginfodir}/lib/modules/%{KernelVer} +%endif + +# deal with module, if not kdump +make ARCH=%{Arch} INSTALL_MOD_PATH=$RPM_BUILD_ROOT modules_install KERNELRELEASE=%{KernelVer} mod-fw= +######## to collect ko to module.filelist about netwoking. block. drm. modesetting ############### +pushd $RPM_BUILD_ROOT/lib/modules/%{KernelVer} +find -type f -name "*.ko" >modnames + +# mark modules executable so that strip-to-file can strip them +xargs --no-run-if-empty chmod u+x < modnames + +# Generate a list of modules for block and networking. + +grep -F /drivers/ modnames | xargs --no-run-if-empty nm -upA | +sed -n 's,^.*/\([^/]*\.ko\): *U \(.*\)$,\1 \2,p' > drivers.undef + +collect_modules_list() +{ + sed -r -n -e "s/^([^ ]+) \\.?($2)\$/\\1/p" drivers.undef | + LC_ALL=C sort -u > modules.$1 + if [ ! -z "$3" ]; then + sed -r -e "/^($3)\$/d" -i modules.$1 + fi +} + +collect_modules_list networking \ + 'register_netdev|ieee80211_register_hw|usbnet_probe|phy_driver_register|rt2x00(pci|usb)_probe|register_netdevice' +collect_modules_list block \ + 'ata_scsi_ioctl|scsi_add_host|scsi_add_host_with_dma|blk_alloc_queue|blk_init_queue|register_mtd_blktrans|scsi_esp_register|scsi_register_device_handler|blk_queue_physical_block_size|ahci_platform_get_resources' 'pktcdvd.ko|dm-mod.ko' +collect_modules_list drm \ + 'drm_open|drm_init' +collect_modules_list modesetting \ + 'drm_crtc_init' + +# detect missing or incorrect license tags +rm -f modinfo +while read i +do + echo -n "$i " >> modinfo + /sbin/modinfo -l $i >> modinfo +done < modnames + +grep -E -v \ + 'GPL( v2)?$|Dual BSD/GPL$|Dual MPL/GPL$|GPL and additional rights$' \ + modinfo && exit 1 + +rm -f modinfo modnames drivers.undef + +for i in alias alias.bin builtin.bin ccwmap dep dep.bin ieee1394map inputmap isapnpmap ofmap pcimap seriomap symbols symbols.bin usbmap +do + rm -f $RPM_BUILD_ROOT/lib/modules/$KernelVer/modules.$i +done +popd +# modsign module ko;need after find-debuginfo,strip +%define __modsign_install_post \ + if [ "%{with_signmodules}" -eq "1" ];then \ + cp certs/signing_key.pem . \ + cp certs/signing_key.x509 . \ + chmod 0755 %{modsign_cmd} \ + %{modsign_cmd} $RPM_BUILD_ROOT/lib/modules/%{KernelVer} || exit 1 \ + fi \ + find $RPM_BUILD_ROOT/lib/modules/ -type f -name '*.ko' | xargs -n1 -P`nproc --all` xz; \ +%{nil} + +# deal with header +make ARCH=%{Arch} INSTALL_HDR_PATH=$RPM_BUILD_ROOT/usr KBUILD_SRC= headers_install +make ARCH=%{Arch} INSTALL_HDR_PATH=$RPM_BUILD_ROOT/usr headers_check +find $RPM_BUILD_ROOT/usr/include -name "\.*" -exec rm -rf {} \; + +# aarch64 dtbs install +%ifarch aarch64 + mkdir -p $RPM_BUILD_ROOT/boot/dtb-%{KernelVer} + install -m 644 $(find arch/%{Arch}/boot -name "*.dtb") $RPM_BUILD_ROOT/boot/dtb-%{KernelVer}/ + rm -f $(find arch/$Arch/boot -name "*.dtb") +%endif + +# deal with vdso +make -s ARCH=%{Arch} INSTALL_MOD_PATH=$RPM_BUILD_ROOT vdso_install KERNELRELEASE=%{KernelVer} +if [ ! -s ldconfig-kernel.conf ]; then + echo "# Placeholder file, no vDSO hwcap entries used in this kernel." >ldconfig-kernel.conf +fi +install -D -m 444 ldconfig-kernel.conf $RPM_BUILD_ROOT/etc/ld.so.conf.d/kernel-%{KernelVer}.conf + +# deal with /lib/module/ path- sub path: build source kernel +rm -f $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build +rm -f $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/source +mkdir -p $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build +mkdir -p $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/extra +mkdir -p $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/updates +mkdir -p $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/weak-updates +############ to do collect devel file ######### +# 1. Makefile And Kconfig, .config sysmbol +# 2. scrpits dir +# 3. .h file +find -type f \( -name "Makefile*" -o -name "Kconfig*" \) -exec cp --parents {} $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build \; +for f in Module.symvers System.map Module.markers .config;do + test -f $f || continue + cp $f $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build +done + +cp -a scripts $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build +if [ -d arch/%{Arch}/scripts ]; then + cp -a arch/%{Arch}/scripts $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/arch/%{_arch} || : +fi +if [ -f arch/%{Arch}/*lds ]; then + cp -a arch/%{Arch}/*lds $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/arch/%{_arch}/ || : +fi +find $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/scripts/ -name "*.o" -exec rm -rf {} \; + +if [ -d arch/%{Arch}/include ]; then + cp -a --parents arch/%{Arch}/include $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/ +fi +cp -a include $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/include + +if [ -f arch/%{Arch}/kernel/module.lds ]; then + cp -a --parents arch/%{Arch}/kernel/module.lds $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/ +fi + +# module.lds is moved to scripts by commit 596b0474d3d9 in linux 5.10. +if [ -f scripts/module.lds ]; then + cp -a --parents scripts/module.lds $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/ +fi + +%ifarch aarch64 + cp -a --parents arch/arm/include/asm $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/ +%endif + +# copy objtool for kernel-devel (needed for building external modules) +if grep -q CONFIG_STACK_VALIDATION=y .config; then + mkdir -p $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/tools/objtool + cp -a tools/objtool/objtool $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/tools/objtool +fi + +# Make sure the Makefile and version.h have a matching timestamp so that +# external modules can be built +touch -r $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/Makefile $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/include/generated/uapi/linux/version.h +touch -r $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/.config $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/include/generated/autoconf.h +# for make prepare +if [ ! -f $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/include/config/auto.conf ];then + cp .config $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build/include/config/auto.conf +fi + +mkdir -p %{buildroot}/usr/src/kernels +mv $RPM_BUILD_ROOT/lib/modules/%{KernelVer}/build $RPM_BUILD_ROOT/usr/src/kernels/%{KernelVer} + +find $RPM_BUILD_ROOT/usr/src/kernels/%{KernelVer} -name ".*.cmd" -exec rm -f {} \; + +pushd $RPM_BUILD_ROOT/lib/modules/%{KernelVer} +ln -sf /usr/src/kernels/%{KernelVer} build +ln -sf build source +popd + + +# deal with doc , now we don't need + + +# deal with kernel abi whitelists. now we don't need + + +## install tools +%if %{with_perf} +# perf +# perf tool binary and supporting scripts/binaries +%if 0%{?with_python2} +%{perf_make} %{perf_python2} DESTDIR=%{buildroot} lib=%{_lib} install-bin install-traceevent-plugins +%else +%{perf_make} %{perf_python3} DESTDIR=%{buildroot} lib=%{_lib} install-bin install-traceevent-plugins +%endif +# remove the 'trace' symlink. +rm -f %{buildroot}%{_bindir}/trace + +# remove examples +rm -rf %{buildroot}/usr/lib/perf/examples +# remove the stray header file that somehow got packaged in examples +rm -rf %{buildroot}/usr/lib/perf/include/bpf/ + +# python-perf extension +%{perf_make} %{perf_python3} DESTDIR=%{buildroot} install-python_ext +%if 0%{?with_python2} +%{perf_make} %{perf_python2} DESTDIR=%{buildroot} install-python_ext +%endif + +# perf man pages (note: implicit rpm magic compresses them later) +install -d %{buildroot}/%{_mandir}/man1 +install -pm0644 tools/kvm/kvm_stat/kvm_stat.1 %{buildroot}/%{_mandir}/man1/ +install -pm0644 tools/perf/Documentation/*.1 %{buildroot}/%{_mandir}/man1/ +%endif + +# bpftool +pushd tools/bpf/bpftool +make DESTDIR=%{buildroot} prefix=%{_prefix} bash_compdir=%{_sysconfdir}/bash_completion.d/ mandir=%{_mandir} install doc-install +popd +# cpupower +make -C tools/power/cpupower DESTDIR=%{buildroot} libdir=%{_libdir} mandir=%{_mandir} CPUFREQ_BENCH=false install +rm -f %{buildroot}%{_libdir}/*.{a,la} +%find_lang cpupower +mv cpupower.lang ../ +%ifarch %{ix86} + pushd tools/power/cpupower/debug/i386 + install -m755 centrino-decode %{buildroot}%{_bindir}/centrino-decode + install -m755 powernow-k8-decode %{buildroot}%{_bindir}/powernow-k8-decode + popd +%endif +%ifarch x86_64 + pushd tools/power/cpupower/debug/x86_64 + install -m755 centrino-decode %{buildroot}%{_bindir}/centrino-decode + install -m755 powernow-k8-decode %{buildroot}%{_bindir}/powernow-k8-decode + popd +%endif +chmod 0755 %{buildroot}%{_libdir}/libcpupower.so* +mkdir -p %{buildroot}%{_unitdir} %{buildroot}%{_sysconfdir}/sysconfig +install -m644 %{SOURCE2000} %{buildroot}%{_unitdir}/cpupower.service +install -m644 %{SOURCE2001} %{buildroot}%{_sysconfdir}/sysconfig/cpupower +%ifarch %{ix86} x86_64 + mkdir -p %{buildroot}%{_mandir}/man8 + pushd tools/power/x86/x86_energy_perf_policy + make DESTDIR=%{buildroot} install + popd + pushd tools/power/x86/turbostat + make DESTDIR=%{buildroot} install + popd +%endif +# thermal +pushd tools/thermal/tmon +make INSTALL_ROOT=%{buildroot} install +popd +# iio +pushd tools/iio +make DESTDIR=%{buildroot} install +popd +# gpio +pushd tools/gpio +make DESTDIR=%{buildroot} install +popd +# kvm +pushd tools/kvm/kvm_stat +make INSTALL_ROOT=%{buildroot} install-tools +popd + +%define __spec_install_post\ +%{?__debug_package:%{__debug_install_post}}\ +%{__arch_install_post}\ +%{__os_install_post}\ +%{__modsign_install_post}\ +%{nil} + +%post +%{_sbindir}/new-kernel-pkg --package kernel --install %{KernelVer} || exit $? + +%preun +if [ `uname -i` == "aarch64" ] && + [ -f /boot/EFI/grub2/grub.cfg ]; then + /usr/bin/sh %{_sbindir}/mkgrub-menu-%{devel_release}.sh %{version}-%{devel_release}.aarch64 /boot/EFI/grub2/grub.cfg remove +fi + +%postun +%{_sbindir}/new-kernel-pkg --rminitrd --rmmoddep --remove %{KernelVer} || exit $? +if [ -x %{_sbindir}/weak-modules ] +then + %{_sbindir}/weak-modules --remove-kernel %{KernelVer} || exit $? +fi + +# remove empty directory +if [ -d /lib/modules/%{KernelVer} ] && [ "`ls -A /lib/modules/%{KernelVer}`" = "" ]; then + rm -rf /lib/modules/%{KernelVer} +fi + +%posttrans +%{_sbindir}/new-kernel-pkg --package kernel --mkinitrd --dracut --depmod --update %{KernelVer} || exit $? +%{_sbindir}/new-kernel-pkg --package kernel --rpmposttrans %{KernelVer} || exit $? +if [ `uname -i` == "aarch64" ] && + [ -f /boot/EFI/grub2/grub.cfg ]; then + /usr/bin/sh %{_sbindir}/mkgrub-menu-%{devel_release}.sh %{version}-%{devel_release}.aarch64 /boot/EFI/grub2/grub.cfg update +fi +if [ -x %{_sbindir}/weak-modules ] +then + %{_sbindir}/weak-modules --add-kernel %{KernelVer} || exit $? +fi +%{_sbindir}/new-kernel-pkg --package kernel --mkinitrd --dracut --depmod --update %{KernelVer} || exit $? +%{_sbindir}/new-kernel-pkg --package kernel --rpmposttrans %{KernelVer} || exit $? + +%post devel +if [ -f /etc/sysconfig/kernel ] +then + . /etc/sysconfig/kernel || exit $? +fi +if [ "$HARDLINK" != "no" -a -x /usr/sbin/hardlink ] +then + (cd /usr/src/kernels/%{KernelVer} && + /usr/bin/find . -type f | while read f; do + hardlink -c /usr/src/kernels/*.oe*.*/$f $f + done) +fi + +%post -n %{name}-tools +/sbin/ldconfig +%systemd_post cpupower.service + +%preun -n %{name}-tools +%systemd_preun cpupower.service + +%postun -n %{name}-tools +/sbin/ldconfig +%systemd_postun cpupower.service + +%files +%defattr (-, root, root) +%doc +/boot/config-* +%ifarch aarch64 +/boot/dtb-* +%endif +/boot/symvers-* +/boot/System.map-* +/boot/vmlinuz-* +%ghost /boot/initramfs-%{KernelVer}.img +/boot/.vmlinuz-*.hmac +/etc/ld.so.conf.d/* +/lib/modules/%{KernelVer}/ +%exclude /lib/modules/%{KernelVer}/source +%exclude /lib/modules/%{KernelVer}/build +%{_sbindir}/mkgrub-menu*.sh + +%files devel +%defattr (-, root, root) +%doc +/lib/modules/%{KernelVer}/source +/lib/modules/%{KernelVer}/build +/usr/src/kernels/%{KernelVer} + +%files headers +%defattr (-, root, root) +/usr/include/* + +%if %{with_perf} +%files -n perf +%{_bindir}/perf +%{_libdir}/libperf-jvmti.so +%dir %{_libdir}/traceevent +%{_libdir}/traceevent/plugins/ +%{_libexecdir}/perf-core +%{_datadir}/perf-core/ +%{_mandir}/man[1-8]/perf* +%{_sysconfdir}/bash_completion.d/perf +%doc linux-%{KernelVer}/tools/perf/Documentation/examples.txt +%dir %{_datadir}/doc/perf-tip +%{_datadir}/doc/perf-tip/* +%license linux-%{KernelVer}/COPYING + +%if 0%{?with_python2} +%files -n python2-perf +%license linux-%{KernelVer}/COPYING +%{python2_sitearch}/* +%endif + +%files -n python3-perf +%license linux-%{KernelVer}/COPYING +%{python3_sitearch}/* +%endif + +%files -n %{name}-tools -f cpupower.lang +%{_bindir}/cpupower +%ifarch %{ix86} x86_64 +%{_bindir}/centrino-decode +%{_bindir}/powernow-k8-decode +%endif +%{_unitdir}/cpupower.service +%{_datadir}/bash-completion/completions/cpupower +%{_mandir}/man[1-8]/cpupower* +%config(noreplace) %{_sysconfdir}/sysconfig/cpupower +%ifarch %{ix86} x86_64 +%{_bindir}/x86_energy_perf_policy +%{_mandir}/man8/x86_energy_perf_policy* +%{_bindir}/turbostat +%{_mandir}/man8/turbostat* +%endif +%{_bindir}/tmon +%{_bindir}/iio_event_monitor +%{_bindir}/iio_generic_buffer +%{_bindir}/lsiio +%{_bindir}/lsgpio +%{_bindir}/gpio-hammer +%{_bindir}/gpio-event-mon +%{_bindir}/gpio-watch +%{_mandir}/man1/kvm_stat* +%{_bindir}/kvm_stat +%{_libdir}/libcpupower.so.0 +%{_libdir}/libcpupower.so.0.0.1 +%license linux-%{KernelVer}/COPYING + +%files -n %{name}-tools-devel +%{_libdir}/libcpupower.so +%{_includedir}/cpufreq.h +%{_includedir}/cpuidle.h + +%files -n bpftool +%{_sbindir}/bpftool +%{_sysconfdir}/bash_completion.d/bpftool +%{_mandir}/man8/bpftool-cgroup.8.gz +%{_mandir}/man8/bpftool-map.8.gz +%{_mandir}/man8/bpftool-prog.8.gz +%{_mandir}/man8/bpftool-perf.8.gz +%{_mandir}/man8/bpftool.8.gz +%{_mandir}/man8/bpftool-btf.8.gz +%{_mandir}/man8/bpftool-feature.8.gz +%{_mandir}/man8/bpftool-gen.8.gz +%{_mandir}/man8/bpftool-iter.8.gz +%{_mandir}/man8/bpftool-link.8.gz +%{_mandir}/man8/bpftool-net.8.gz +%{_mandir}/man8/bpftool-struct_ops.8.gz +%{_mandir}/man7/bpf-helpers.7.gz +%license linux-%{KernelVer}/COPYING + +%if 0%{?with_source} +%files source +%defattr(-,root,root) +/usr/src/linux-%{KernelVer}/* +/usr/src/linux-%{KernelVer}/.config +/usr/src/linux-%{KernelVer}/.scmversion +%endif + +%changelog +* Fri Apr 29 2022 kylin-mayukun - 5.10.0-83.0.0.40 +- add kernel-rt.spec and rt patches + +* Sun Apr 24 2022 Zheng Zengkai - 5.10.0-83.0.0.39 +- hugetlb: Add huge page alloced limit +- kfence: parse param before alloc kfence_pool +- sysctl: Modify sysctl_overload_detect_period minimum to 100ms +- ax25: Fix NULL pointer dereferences in ax25 timers +- ax25: fix NPD bug in ax25_disconnect +- ax25: Fix NULL pointer dereference in ax25_kill_by_device +- ax25: improve the incomplete fix to avoid UAF and NPD bugs +- arm64: clear_page() shouldn't use DC ZVA when DCZID_EL0.DZP == 1 +- mm: gup: fix potential pgmap refcnt leak in __gup_device_huge() +- mtd: phram: Fix error return code in phram_setup() + +* Fri Apr 22 2022 Zheng Zengkai - 5.10.0-82.0.0.38 +- scsi: hisi_sas: Limit users changing debugfs BIST count value +- netfilter: nf_tables: initialize registers in nft_do_chain() +- sched: Fix yet more sched_fork() races +- USB: gadget: validate interface OS descriptor requests +- usb: gadget: don't release an existing dev->buf +- usb: gadget: clear related members when goto fail +- usb: gadget: rndis: check size of RNDIS_MSG_SET command +- locking/csd_lock: Add boot parameter for controlling CSD lock debugging +- mm/mempolicy: fix a race between offset_il_node and mpol_rebind_task +- PCI: fix kabi change in struct pci_dev +- PCI/RCEC: Fix RCiEP device to RCEC association +- PCI/AER: Add RCEC AER error injection support +- PCI/PME: Add pcie_walk_rcec() to RCEC PME handling +- PCI/AER: Add pcie_walk_rcec() to RCEC AER handling +- PCI/ERR: Recover from RCiEP AER errors +- PCI/ERR: Add pcie_link_rcec() to associate RCiEPs +- PCI/ERR: Recover from RCEC AER errors +- PCI/ERR: Clear AER status only when we control AER +- PCI/ERR: Add pci_walk_bridge() to pcie_do_recovery() +- PCI/ERR: Avoid negated conditional for clarity +- PCI/ERR: Use "bridge" for clarity in pcie_do_recovery() +- PCI/ERR: Simplify by computing pci_pcie_type() once +- PCI/ERR: Simplify by using pci_upstream_bridge() +- PCI/ERR: Rename reset_link() to reset_subordinates() +- PCI/ERR: Cache RCEC EA Capability offset in pci_init_capabilities() +- PCI/ERR: Bind RCEC devices to the Root Port driver +- PCI/AER: Write AER Capability only when we control it +- af_key: add __GFP_ZERO flag for compose_sadb_supported in function pfkey_register + +* Tue Apr 19 2022 Zheng Zengkai - 5.10.0-81.0.0.37 +- SUNRPC: Ensure we flush any closed sockets before xs_xprt_free() +- scsi: hisi_sas: Use autosuspend for the host controller +- scsi: libsas: Keep host active while processing events +- scsi: hisi_sas: Keep controller active between ISR of phyup and the event being processed +- scsi: libsas: Defer works of new phys during suspend +- scsi: libsas: Refactor sas_queue_deferred_work() +- scsi: libsas: Add flag SAS_HA_RESUMING +- scsi: libsas: Resume host while sending SMP I/Os +- scsi: hisi_sas: Add more logs for runtime suspend/resume +- scsi: libsas: Insert PORTE_BROADCAST_RCVD event for resuming host +- scsi: mvsas: Add spin_lock/unlock() to protect asd_sas_port->phy_list +- scsi: hisi_sas: Fix some issues related to asd_sas_port->phy_list +- scsi: libsas: Add spin_lock/unlock() to protect asd_sas_port->phy_list +- scsi: block: pm: Always set request queue runtime active in blk_post_runtime_resume() +- scsi: Revert "scsi: hisi_sas: Filter out new PHY up events during suspend" +- scsi: libsas: Don't always drain event workqueue for HA resume +- scsi: hisi_sas: Wait for phyup in hisi_sas_control_phy() +- scsi: hisi_sas: Initialise devices in .slave_alloc callback +- can: ems_usb: ems_usb_start_xmit(): fix double dev_kfree_skb() in error path +- drivers: hamradio: 6pack: fix UAF bug caused by mod_timer() +- hamradio: remove needs_free_netdev to avoid UAF +- hamradio: defer 6pack kfree after unregister_netdev +- mm: page_counter: mitigate consequences of a page_counter underflow +- nbd: fix possible overflow on 'first_minor' in nbd_dev_add() +- io_uring: don't keep looping for more events if we can't flush overflow +- kfence: Fix wrong memblock_free when enable dynamic +- hugetlbfs: fix a truncation issue in hugepages parameter +- spi: hisi-kunpeng: Fix the debugfs directory name incorrect +- spi: hisi-kunpeng: Add debugfs support +- xen/netfront: react properly to failing gnttab_end_foreign_access_ref() +- xen/gnttab: fix gnttab_end_foreign_access() without page specified +- xen/pvcalls: use alloc/free_pages_exact() +- xen/9p: use alloc/free_pages_exact() +- xen: remove gnttab_query_foreign_access() +- xen/gntalloc: don't use gnttab_query_foreign_access() +- xen/scsifront: don't use gnttab_query_foreign_access() for mapped status +- xen/netfront: don't use gnttab_query_foreign_access() for mapped status +- xen/blkfront: don't use gnttab_query_foreign_access() for mapped status +- xen/grant-table: add gnttab_try_end_foreign_access() +- xen/xenbus: don't let xenbus_grant_ring() remove grants in error case +- net: sched: fix use-after-free in tc_new_tfilter() +- mtd: fixup CFI on ixp4xx +- powerpc/pseries: Get entry and uaccess flush required bits from H_GET_CPU_CHARACTERISTICS +- ALSA: hda/realtek: Re-order quirk entries for Lenovo +- ALSA: hda/realtek: Add quirk for Legion Y9000X 2020 +- ALSA: hda: ALC287: Add Lenovo IdeaPad Slim 9i 14ITL5 speaker quirk +- ALSA: hda/realtek - Fix silent output on Gigabyte X570 Aorus Master after reboot from Windows +- ALSA: hda/realtek: Add speaker fixup for some Yoga 15ITL5 devices +- KVM: x86: remove PMU FIXED_CTR3 from msrs_to_save_all +- firmware: qemu_fw_cfg: fix kobject leak in probe error path +- firmware: qemu_fw_cfg: fix NULL-pointer deref on duplicate entries +- firmware: qemu_fw_cfg: fix sysfs information leak +- rtlwifi: rtl8192cu: Fix WARNING when calling local_irq_restore() with interrupts enabled +- media: uvcvideo: fix division by zero at stream start +- video: vga16fb: Only probe for EGA and VGA 16 color graphic cards +- 9p: only copy valid iattrs in 9P2000.L setattr implementation +- KVM: s390: Clarify SIGP orders versus STOP/RESTART +- KVM: x86: Register Processor Trace interrupt hook iff PT enabled in guest +- perf: Protect perf_guest_cbs with RCU +- remoteproc: qcom: pil_info: Don't memcpy_toio more than is provided +- orangefs: Fix the size of a memory allocation in orangefs_bufmap_alloc() +- devtmpfs regression fix: reconfigure on each mount +- kbuild: Add $(KBUILD_HOSTLDFLAGS) to 'has_libelf' test +- staging: greybus: fix stack size warning with UBSAN +- drm/i915: Avoid bitwise vs logical OR warning in snb_wm_latency_quirk() +- staging: wlan-ng: Avoid bitwise vs logical OR warning in hfa384x_usb_throttlefn() +- media: Revert "media: uvcvideo: Set unique vdev name based in type" +- random: fix crash on multiple early calls to add_bootloader_randomness() +- random: fix data race on crng init time +- random: fix data race on crng_node_pool +- can: gs_usb: gs_can_start_xmit(): zero-initialize hf->{flags,reserved} +- can: isotp: convert struct tpcon::{idx,len} to unsigned int +- can: gs_usb: fix use of uninitialized variable, detach device on reception of invalid USB data +- mfd: intel-lpss: Fix too early PM enablement in the ACPI ->probe() +- veth: Do not record rx queue hint in veth_xmit +- mmc: sdhci-pci: Add PCI ID for Intel ADL +- ath11k: Fix buffer overflow when scanning with extraie +- USB: Fix "slab-out-of-bounds Write" bug in usb_hcd_poll_rh_status +- USB: core: Fix bug in resuming hub's handling of wakeup requests +- ARM: dts: exynos: Fix BCM4330 Bluetooth reset polarity in I9100 +- Bluetooth: bfusb: fix division by zero in send path +- Bluetooth: btusb: Add support for Foxconn QCA 0xe0d0 +- Bluetooth: btusb: Add support for Foxconn MT7922A +- Bluetooth: btusb: Add two more Bluetooth parts for WCN6855 +- Bluetooth: btusb: fix memory leak in btusb_mtk_submit_wmt_recv_urb() +- workqueue: Fix unbind_workers() VS wq_worker_running() race + +* Wed Apr 13 2022 Zheng Zengkai - 5.10.0-80.0.0.36 +- USB: gadget: validate endpoint index for xilinx udc +- sr9700: sanity check for packet length +- Reinstate some of "swiotlb: rework "fix info leak with DMA_FROM_DEVICE"" +- swiotlb: fix info leak with DMA_FROM_DEVICE + +* Fri Apr 08 2022 Zheng Zengkai - 5.10.0-79.0.0.35 +- sched/fair: Add qos_throttle_list node in struct cfs_rq +- ARM: 9142/1: kasan: work around LPAE build warning +- mm: kfence: fix missing objcg housekeeping for SLAB +- cgroup: Export cgroup.kill from cgroupv2 to cgroupv1 +- cgroup: introduce cgroup.kill +- memcg: Fix inconsistent oom event behavior for OOM_MEMCG_KILL +- memcg: Export memory.events and memory.events.local from cgroupv2 to cgroupv1 +- net: hns3: fix phy can not link up when autoneg off and reset +- net: hns3: add NULL pointer check for hns3_set/get_ringparam() +- net: hns3: add netdev reset check for hns3_set_tunable() +- net: hns3: clean residual vf config after disable sriov +- net: hns3: add max order judgement for tx spare buffer +- net: hns3: fix ethtool tx copybreak buf size indicating not aligned issue +- net: hns3: refine the process when PF set VF VLAN +- net: hns3: add vlan list lock to protect vlan list +- net: hns3: fix port base vlan add fail when concurrent with reset +- net: hns3: fix bug when PF set the duplicate MAC address for VFs +- net: hns3: handle empty unknown interrupt for VF +- net: hns3: fix race condition in debugfs +- arm64: cpu_park: Move into stand-alone file +- arm64: quick_kexec: Move to stand-alone file +- jffs2: fix NULL pointer dereference in jffs2_scan_medium +- rseq, ptrace: Add PTRACE_GET_RSEQ_CONFIGURATION request +- config: enable CONFIG_MEMCG_MEMFS_INFO by default +- mm/memcg_memfs_info: show files that having pages charged in mem_cgroup +- share_pool: don't trace the invalid spa address +- mm: share_pool: adjust sp_alloc behavior when coredump +- mm: share_pool: adjust sp_make_share_k2u behavior when coredump + +* Wed Mar 30 2022 Zheng Zengkai - 5.10.0-78.0.0.34 +- net/spnic: Remove spnic driver. +- SCSI: spfc: remove SPFC driver +- net: snmp: inline snmp_get_cpu_field() +- block-map: add __GFP_ZERO flag for alloc_page in function bio_copy_kern +- esp: Fix possible buffer overflow in ESP transformation +- sock: remove one redundant SKB_FRAG_PAGE_ORDER macro +- kabi: only reserve flags on X86_64 and ARM64 +- mm/dynamic_hugetlb: only compile PG_pool on X86_64 and ARM64 +- kabi: fix kabi broken in struct fuse_args +- fuse: fix pipe buffer lifetime for direct_io +- vfs: fs_context: fix up param length parsing in legacy_parse_param +- NFS: LOOKUP_DIRECTORY is also ok with symlinks +- blk-mq: fix potential uaf for 'queue_hw_ctx' +- blk-mq: add exception handling when srcu->sda alloc failed +- mm/dynamic_hugetlb: initialize subpages before merging +- mm/dynamic_hugetlb: set/clear HPageFreed +- mm/dynamic_hugetlb: only support to merge 2M dynamicly +- mm/dynamic_hugetlb: hold the lock until pages back to hugetlb +- mm/dynamic_hugetlb: use mem_cgroup_force_empty to reclaim pages +- mm/dynamic_hugetlb: check page using check_new_page +- mm/dynamic_hugetlb: use pfn to traverse subpages +- mm/dynamic_hugetlb: improve the initialization of huge pages +- mm/dynamic_hugetlb: check free_pages_prepares when split pages +- irqchip/gic-phytium-2500: Fix issue that interrupts are concentrated in one cpu +- scsi: ses: Fix crash caused by kfree an invalid pointer +- arm64: kexec: Fix missing error code 'ret' warning in load_other_segments() +- ovl: fix incorrect extent info in metacopy case +- perf sched: Cast PTHREAD_STACK_MIN to int as it may turn into sysconf(__SC_THREAD_STACK_MIN_VALUE) +- arm64: remove page granularity limitation from KFENCE +- Revert "arm64: remove page granularity limitation from KFENCE" +- kfence: Fix wrong size of alloc_covered when enable dynamic +- audit: improve audit queue handling when "audit=1" on cmdline +- Revert "audit: bugfix for infinite loop when flush the hold queue" +- arm/arm64: paravirt: Remove GPL from pv_ops export +- ima: bugfix for digest lists importing +- net/hinic: Fix call trace when the rx_buff module parameter is grater than 2 +- net/hinic: Fix null pointer dereference in hinic_physical_port_id +- net/hinic: Fix double free issue +- eulerfs: remove redundant calculations +- scsi: spfc: Remove redundant mask and spinlock +- xfs: order CIL checkpoint start records +- xfs: attach iclog callbacks in xlog_cil_set_ctx_write_state() +- xfs: factor out log write ordering from xlog_cil_push_work() +- xfs: pass a CIL context to xlog_write() +- xfs: fix the forward progress assertion in xfs_iwalk_run_callbacks +- xfs: move xlog_commit_record to xfs_log_cil.c +- xfs: log head and tail aren't reliable during shutdown +- xfs: don't run shutdown callbacks on active iclogs +- xfs: separate out log shutdown callback processing +- xfs: rework xlog_state_do_callback() +- xfs: make forced shutdown processing atomic +- xfs: convert log flags to an operational state field +- xfs: move recovery needed state updates to xfs_log_mount_finish +- xfs: XLOG_STATE_IOERROR must die +- xfs: convert XLOG_FORCED_SHUTDOWN() to xlog_is_shutdown() +- Revert "nfs: ensure correct writeback errors are returned on close()" +- fuse: support SB_NOSEC flag to improve write performance +- fuse: add a flag FUSE_OPEN_KILL_SUIDGID for open() request +- fuse: don't send ATTR_MODE to kill suid/sgid for handle_killpriv_v2 +- fuse: setattr should set FATTR_KILL_SUIDGID +- fuse: set FUSE_WRITE_KILL_SUIDGID in cached write path +- fuse: rename FUSE_WRITE_KILL_PRIV to FUSE_WRITE_KILL_SUIDGID +- fuse: introduce the notion of FUSE_HANDLE_KILLPRIV_V2 +- xfs: remove dead stale buf unpin handling code +- xfs: hold buffer across unpin and potential shutdown processing +- xfs: fix an ABBA deadlock in xfs_rename +- Revert "efi/libstub: arm64: Relax 2M alignment again for relocatable kernels" +- crypto: hisilicon/qm - fix memset during queues clearing +- crypto: hisilicon/qm - modify device status check parameter +- crypto: hisilicon/qm - remove redundant cache writeback +- crypto: hisilicon/qm - disable queue when 'CQ' error +- crypto: hisilicon/qm - reset function if event queue overflows +- crypto: hisilicon/qm - use request_threaded_irq instead +- crypto: hisilicon/qm - modify the handling method after abnormal interruption +- crypto: hisilicon/qm - code movement +- crypto: hisilicon/qm - remove unnecessary device memory reset +- crypto: hisilicon/qm - fix deadlock for remove driver +- crypto: hisilicon/sec - add some comments for soft fallback +- crypto: hisilicon/sec - fix the aead software fallback for engine +- blk-throttle: Set BIO_THROTTLED when bio has been throttled +- bpf, selftests: Add ringbuf memory type confusion test +- bpf/selftests: Test bpf_d_path on rdonly_mem. +- bpf, selftests: Add various ringbuf tests with invalid offset +- selftests/bpf: Add verifier test for PTR_TO_MEM spill +- bpf: Fix ringbuf memory type confusion when passing to helpers +- bpf: Fix out of bounds access for ringbuf helpers +- bpf: Generally fix helper register offset check +- bpf: Mark PTR_TO_FUNC register initially with zero offset +- bpf: Generalize check_ctx_reg for reuse with other types +- bpf/selftests: Test PTR_TO_RDONLY_MEM +- bpf: Add MEM_RDONLY for helper args that are pointers to rdonly mem. +- bpf: Make per_cpu_ptr return rdonly PTR_TO_MEM. +- bpf: Convert PTR_TO_MEM_OR_NULL to composable types. +- bpf: Introduce MEM_RDONLY flag +- bpf: Replace PTR_TO_XXX_OR_NULL with PTR_TO_XXX | PTR_MAYBE_NULL +- bpf: Replace RET_XXX_OR_NULL with RET_XXX | PTR_MAYBE_NULL +- bpf: Replace ARG_XXX_OR_NULL with ARG_XXX | PTR_MAYBE_NULL +- bpf: Introduce composable reg, ret and arg types. +- bpf: Fix out of bounds access from invalid *_or_null type verification +- blk-mq: decrease pending_queues when it expires +- blk-mq: add debugfs to print information for blk_mq_tag_set +- blk-mq: allow hardware queue to get more tag while sharing a tag set +- bfq: fix use-after-free in bfq_dispatch_request +- livepatch/core: Validate function old_name before 'klp_init_object_loaded' +- arm64: config: enable CONFIG_ARM64_UCE_KERNEL_RECOVERY +- arm64: ras: copy_from_user scenario support uce kernel recovery +- efi: Fix efi_find_mirror redefine in x86 +- sched: Fix sleeping in atomic context at cpu_qos_write() +- vfio/iommu_type1: Fix the logic of updating num_non_hwdbm_domains +- iommu: Stop tracking the dirty log status of iommu_domain +- iommu/smmuv3: Remove the S1 mapping restriction of dirty log +- timekeeping: Avoiding false sharing in field access of tk_core +- config: close CONFIG_ARM64_ILP32 +- arm64: replace is_compat_task() with is_ilp32_compat_task() in TASK_SIZE_MAX +- arch_topology: Fix missing clear cluster_cpumask in remove_cpu_topology() +- kabi: fix split error of kABI reference checking tool +- ipv6: blackhole_netdev needs snmp6 counters +- net: avoid quadratic behavior in netdev_wait_allrefs_any() +- net: allow out-of-order netdev unregistration +- net: transition netdev reg state earlier in run_todo +- ipv6: give an IPv6 dev to blackhole_netdev +- configs: disable CONFIG_RODATA_FULL_DEFAULT_ENABLED +- dm rq: don't queue request to blk-mq during DM suspend +- rcu/nocb: Fix missed nocb_timer requeue +- dm: fix mempool NULL pointer race when completing IO +- blk-mq: Improve performance of non-mq IO schedulers with multiple HW queues +- Revert "blk-mq, elevator: Count requests per hctx to improve performance" +- lib/iov_iter: initialize "flags" in new pipe_buffer +- sched: enable CONFIG_QOS_SCHED on arm64 +- sched/qos: Remove dependency CONFIG_x86 +- ubifs: rename_whiteout: correct old_dir size computing +- configs: update the defconfigs to support 9P +- Revert "dm space maps: don't reset space map allocation cursor when committing" +- drivers: hooks: add bonding driver vendor hooks +- etmem: etmem scan module Replace WARN_ONCE() with debug_printk for "nothing read" +- skmsg: Teach sk_psock_verdict_apply() to return errors +- netfilter: nf_tables_offload: incorrect flow offload action array size +- kfence: make test case compatible with run time set sample interval +- kfence: Add a module parameter to adjust kfence objects +- f2fs: fix to do sanity check in is_alive() +- f2fs: fix to avoid panic in is_alive() if metadata is inconsistent +- f2fs: fix to do sanity check on inode type during garbage collection +- iommu/io-pgtable-arm: Fix attach device failed when smmuv3 supports HTTU +- configs: enable CONFIG_INTEL_IDXD +- ext4: convert DIV_ROUND_UP to DIV_ROUND_UP_ULL + +* Wed Feb 23 2022 Zheng Zengkai - 5.10.0-59.0.0.33 +- bonding: force carrier update when releasing slave +- ext4: fix underflow in ext4_max_bitmap_size() +- dm: make sure dm_table is binded before queue request +- tty/amba-pl011: Call acpi_put_table() to fix memory leak +- config: enable MEMORY_RELIABLE by default +- mm: add support for page cache use reliable memory +- shmem: Introduce shmem reliable +- mm: Reserve field in mm_struct for memory reliable +- mm: Introduce reliable flag for user task +- meminfo: Show reliable memory info +- mm: Introduce memory reliable +- efi: Disable mirror feature if kernelcore is not specified +- mm: Demote warning message in vmemmap_verify() to debug level +- mm: Ratelimited mirrored memory related warning messages +- efi: Find mirrored memory ranges for arm64 +- efi: Make efi_find_mirror() public +- arm64: efi: Add fake memory support +- efi: Make efi_print_memmap() public + +* Wed Feb 23 2022 Zheng Zengkai - 5.10.0-58.0.0.32 +- arm64: openeuler_defconfig: Enable config for ultrasoc driver +- drivers/coresight: Add Ultrasoc System Memory Buffer driver +- coresight: etm4x: Modify core-commit to avoid HiSilicon ETM overflow +- RAS: Report ARM processor information to userspace +- configs: enable CONFIG_NTB_INTEL +- udf: Restore i_lenAlloc when inode expansion fails +- udf: Fix NULL ptr deref when converting from inline format +- rcu: Do not report strict GPs for outgoing CPUs +- rcu-tasks: Make ksoftirqd provide RCU Tasks quiescent states +- entry: Explicitly flush pending rcuog wakeup before last rescheduling point +- rcu/nocb: Trigger self-IPI on late deferred wake up before user resume +- irq_work: Cleanup +- powerpc/process, kasan: Silence KASAN warnings in __get_wchan() +- net/spnic: Reduce the timeout of the channel between driver and firmware +- net/spnic: Fix an error when netdev failed to link up +- net/spnic: Fix xor checksum error when sending a non 4B-aligned message to firmware +- net/spnic: Fix ethtool loopback command failure +- net/spnic: Fix array bounds error in ethtool get_link_ksettings +- x86/tsc: Make cur->adjusted values in package#1 to be the same +- ata: Add support for PxSCT.LPM set based on actual LPM capability +- ata: Add support for disabling PhyRdy Change Interrupt based on actual LPM capability +- ahci: Fix some bugs like plugin support and sata link stability when user enable ahci RTD3 +- EHCI: Clear wakeup signal locked in S0 state when device plug in +- XHCI: Fix some device identify fail when enable xHCI runtime suspend +- rtc: Fix set RTC time delay 500ms on some Zhaoxin SOCs + +* Tue Feb 22 2022 Zheng Zengkai - 5.10.0-57.0.0.31 +- yam: fix a memory leak in yam_siocdevprivate() +- Phytium/S2500: kdump: Avoid vmcore saving failure across multi-socket +- irqchip/irq-gic-phytium-2500: Add support for kdump +- ipmi_si: Phytium S2500 workaround for MMIO-based IPMI +- iommu: support phytium ft2000plus and S2500 iommu function +- sw64: vfio: select VFIO_IOMMU_TYPE1 as default +- sw64: tty: add serial driver for sw64 +- sw64: spi: add driver for SPI controller +- sw64: add hypervisor based RTC on SW64 systems +- sw64: kgdb: add support for sw64 +- sw64: LPC: add driver for LPC controller +- sw64: iommu: fix a bug in calling 'alloc_pages_node' +- sw64: iommu: add iommu driver for sw64 +- sw64: gpu/drm: fix kernel crash caused by drm driver +- sw64: radeon: correct low-level mmio memset direct calls +- sw64: gpu/drm: solve driver load cause kernel crash +- amdgpu: enable KFD on SW64 systems +- sw64: megaraid: fix kernel panic caused by accessing an illegal address +- sw64: i2c: add i2c driver based designware for sw64 +- sw64: efi: add SMBIOS/DMI and EFI runtime driver codes +- sw64: gpio: add sunway builtin gpio driver +- sw64: acpi: add initial acpi infrastructure support +- sw64: add perf userspace tool support for sw64 +- tools uapi: fix sw64 support +- sw64: kvm: add definitions for kvm +- sw64: moduleparam: fix sw64 compile failure +- sw64: kdump/kexec: add KEXEC_ARCH_SW_64 definition +- sw64: add AUDIT_ARCH_SW64 definition +- sw64: ftrace: add sw64 support to recordmcount +- sw64: add sw_64 support to buildtar, mkdebian and builddeb +- sw64: add basic support for sw64 +- mm/pin_mem: add invalid check for pinmemory boot parameter +- livepatch/x86: Fix incorrect use of 'strncpy' +- livepatch: Fix issues in klp_mem_{prepare,recycle} +- livepatch: Introduce 'arch_klp_save_old_code' +- livepatch: Reduce duplicated arch_klp_mem_{prepare,recycle} +- livepatch: Move 'klp_func_list' related codes out of 'arch' +- livepatch: Introduce 'struct arch_klp_data' +- livepatch/arm64: Uniform 'old_func' field in struct klp_func_node +- tpm_tis_spi: set default probe function if device id not match +- deconfig: intel ice-lake missing config enable +- selftests/sgx: Fix Q1 and Q2 calculation in sigstruct.c +- selftests/sgx: remove checks for file execute permissions +- selftests/sgx: Refine the test enclave to have storage +- selftests/sgx: Add EXPECT_EEXIT() macro +- selftests/sgx: Dump enclave memory map +- selftests/sgx: Migrate to kselftest harness +- selftests/sgx: Rename 'eenter' and 'sgx_call_vdso' +- x86/sgx: Expose SGX architectural definitions to the kernel +- selftests/sgx: Use getauxval() to simplify test code +- selftests/sgx: Improve error detection and messages +- selftests/sgx: Use a statically generated 3072-bit RSA key +- x86/sgx: Remove unnecessary kmap() from sgx_ioc_enclave_init() +- x86/sgx: Add a basic NUMA allocation scheme to sgx_alloc_epc_page() +- x86/sgx: Replace section->init_laundry_list with sgx_dirty_page_list +- x86/sgx: Maintain encl->refcount for each encl->mm_list entry +- x86/sgx: Drop racy follow_pfn() check +- x86/sgx: Fix the return type of sgx_init() +- x86/sgx: Return -EINVAL on a zero length buffer in sgx_ioc_enclave_add_pages() +- x86/sgx: Fix sgx_ioc_enclave_provision() kernel-doc +- x86/sgx: Return -ERESTARTSYS in sgx_ioc_enclave_add_pages() +- x86/sgx: Clarify 'laundry_list' locking +- x86/sgx: Update MAINTAINERS +- Documentation/x86: Document SGX kernel architecture +- x86/sgx: Add ptrace() support for the SGX driver +- x86/sgx: Add a page reclaimer +- selftests/x86: Add a selftest for SGX +- x86/vdso: Implement a vDSO for Intel SGX enclave call +- x86/traps: Attempt to fixup exceptions in vDSO before signaling +- x86/fault: Add a helper function to sanitize error code +- x86/vdso: Add support for exception fixup in vDSO functions +- x86/sgx: Add SGX_IOC_ENCLAVE_PROVISION +- x86/sgx: Add SGX_IOC_ENCLAVE_INIT +- x86/sgx: Add SGX_IOC_ENCLAVE_ADD_PAGES +- x86/sgx: Add SGX_IOC_ENCLAVE_CREATE +- x86/sgx: Add an SGX misc driver interface +- mm: Add 'mprotect' hook to struct vm_operations_struct +- x86/sgx: Add SGX page allocator functions +- x86/cpu/intel: Add a nosgx kernel parameter +- x86/cpu/intel: Detect SGX support +- x86/sgx: Initialize metadata for Enclave Page Cache (EPC) sections +- x86/{cpufeatures,msr}: Add Intel SGX Launch Control hardware bits +- x86/cpufeatures: Add Intel SGX hardware bits +- x86/sgx: Add wrappers for ENCLS functions +- x86/sgx: Add SGX architectural data structures +- configfs: fix a race in configfs_{,un}register_subsystem() +- fs/dirty_pages: fix wrong lock for inode list in super_block +- ACPI: irq: Prevent unregistering of GIC SGIs +- PM: ACPI: Refresh wakeup device power configuration every time +- ACPICA: Interpreter: fix memory leak by using existing buffer + +* Thu Feb 17 2022 Zheng Zengkai - 5.10.0-56.0.0.30 +- configs: enable CONFIG_INTEGRITY_PLATFORM_KEYRING and CONFIG_LOAD_UEFI_KEYS +- tipc: improve size validations for received domain records +- cgroup-v1: Require capabilities to set release_agent +- NFSv4: nfs_atomic_open() can race when looking up a non-regular file +- NFSv4: Handle case where the lookup of a directory fails +- cgroup/cpuset: Fix a race between cpuset_attach() and cpu hotplug +- block: update io_ticks when io hang +- livepatch: Fix missing unlock on error in klp_enable_patch() +- livepatch: Fix kobject refcount bug on klp_init_patch_early failure path + +* Fri Feb 11 2022 Zheng Zengkai - 5.10.0-55.0.0.29 +- kabi: cleanup config entries of kabi +- kabi: fix build error when CONFIG_KABI_RESERVE=n +- kabi:crypto: reserve space for RSASSA-PSS style certificates +- mm/page_alloc: use accumulated load when building node fallback list +- mm/page_alloc: print node fallback order +- arm64: openeuler_defconfig: Enable Kunpeng related configs + +* Thu Feb 10 2022 Zheng Zengkai - 5.10.0-54.0.0.28 +- rcu: Make TASKS_TRACE_RCU select IRQ_WORK +- x86/kdump: make crash kernel boot faster +- mm, hwpoison: fix condition in free hugetlb page path +- x509: Detect sm2 keys by their parameters OID +- mm/page_alloc.c: fix 'zone_id' may be used uninitialized in this function warning +- sysctl: returns -EINVAL when a negative value is passed to proc_doulongvec_minmax +- arm64: fix address limit problem with TASK_SIZE_MAX +- arm64: mark __system_matches_cap as __maybe_unused +- arm64: Avoid premature usercopy failure +- arm64: uaccess: remove vestigal UAO support +- arm64: uaccess: remove redundant PAN toggling +- arm64: uaccess: remove addr_limit_user_check() +- arm64: uaccess: remove set_fs() +- arm64: uaccess cleanup macro naming +- arm64: uaccess: split user/kernel routines +- arm64: uaccess: refactor __{get,put}_user +- arm64: uaccess: simplify __copy_user_flushcache() +- arm64: uaccess: rename privileged uaccess routines +- arm64: sdei: explicitly simulate PAN/UAO entry +- arm64: sdei: move uaccess logic to arch/arm64/ +- Revert "arm64: fix current_thread_info()->addr_limit setup" +- Revert "arm64: fix USER_DS definition problem in non-compat mode" +- Revert "arm64: Avoid premature usercopy failure" +- arm64: alternatives: Move length validation in alternative_{insn, endif} +- arm64: alternatives: Split up alternative.h +- arm64: uaccess: move uao_* alternatives to asm-uaccess.h +- Revert "arm64: alternatives: Move length validation in alternative_{insn, endif}" +- arm64: add C wrappers for SET_PSTATE_*() +- arm64: ensure ERET from kthread is illegal + +* Sat Jan 29 2022 Zheng Zengkai - 5.10.0-53.0.0.27 +- livepatch/core: Fix where module get and put in different macro +- livepatch/core: Remove redundant klp_free_objects_mod_limited +- livepatch/core: Fix reference count issues +- arm64/mpam: realign step entry when traversing rmid_transform +- dt-bindings: mpam: refactor device tree node structure +- arm64/mpam: refactor device tree structure to support multiple devices +- arm64/mpam: fix __mpam_device_create() section mismatch error +- block, bfq: don't move oom_bfqq +- fget: clarify and improve __fget_files() implementation +- KABI: add reserve space for thread_info struct +- kabi: Reserve syscall entries for kabi compatibility +- perf tools: Update powerpc's syscall.tbl copy from the kernel sources + +* Sat Mar 19 2022 Liu Yuntao - 5.10.0-52.0.0.26 +- Compress modules to xz format in kernel.spec, which reduces disk consumption. + +* Sat Jan 29 2022 Zheng Zengkai - 5.10.0-52.0.0.25 +- kabi: reserve space for arm64 SME in thread_struct +- KABI: KABI reservation for IMA namespace +- kabi: Reserve space for struct acpi_device_power +- kabi:fuse: reserve space for future expansion +- kabi: net: reserve space for some net subsystems related structure +- KABI: reserve space for struct input_dev +- KABI: reserve space for several i2c structures +- KABI: add reserve space for sched structures +- sched: move CPU field back into thread_info if THREAD_INFO_IN_TASK=y +- powerpc: add CPU field to struct thread_info +- s390: add CPU field to struct thread_info +- x86: add CPU field to struct thread_info +- arm64: add CPU field to struct thread_info +- powerpc: smp: remove hack to obtain offset of task_struct::cpu +- riscv: rely on core code to keep thread_info::cpu updated +- Input: zinitix - make sure the IRQ is allocated before it gets enabled +- ARM: dts: gpio-ranges property is now required +- ipv6: raw: check passed optlen before reading +- drm/amd/display: Added power down for DCN10 +- mISDN: change function names to avoid conflicts +- atlantic: Fix buff_ring OOB in aq_ring_rx_clean +- net: udp: fix alignment problem in udp4_seq_show() +- ip6_vti: initialize __ip6_tnl_parm struct in vti6_siocdevprivate +- scsi: libiscsi: Fix UAF in iscsi_conn_get_param()/iscsi_conn_teardown() +- usb: mtu3: fix interval value for intr and isoc +- ipv6: Do cleanup if attribute validation fails in multipath route +- ipv6: Continue processing multipath route even if gateway attribute is invalid +- power: bq25890: Enable continuous conversion for ADC at charging +- rndis_host: support Hytera digital radios +- power: reset: ltc2952: Fix use of floating point literals +- power: supply: core: Break capacity loop +- net: ena: Fix error handling when calculating max IO queues number +- net: ena: Fix undefined state when tx request id is out of bounds +- sch_qfq: prevent shift-out-of-bounds in qfq_init_qdisc +- batman-adv: mcast: don't send link-local multicast to mcast routers +- lwtunnel: Validate RTA_ENCAP_TYPE attribute length +- ipv6: Check attribute length for RTA_GATEWAY when deleting multipath route +- ipv6: Check attribute length for RTA_GATEWAY in multipath route +- ipv4: Check attribute length for RTA_FLOW in multipath route +- ipv4: Check attribute length for RTA_GATEWAY in multipath route +- ftrace/samples: Add missing prototypes direct functions +- i40e: Fix incorrect netdev's real number of RX/TX queues +- i40e: Fix for displaying message regarding NVM version +- i40e: fix use-after-free in i40e_sync_filters_subtask() +- sfc: The RX page_ring is optional +- mac80211: initialize variable have_higher_than_11mbit +- RDMA/uverbs: Check for null return of kmalloc_array +- netrom: fix copying in user data in nr_setsockopt +- RDMA/core: Don't infoleak GRH fields +- iavf: Fix limit of total number of queues to active queues of VF +- i40e: Fix to not show opcode msg on unsuccessful VF MAC change +- ieee802154: atusb: fix uninit value in atusb_set_extended_addr +- tracing: Tag trace_percpu_buffer as a percpu pointer +- tracing: Fix check for trace_percpu_buffer validity in get_trace_buf() +- selftests: x86: fix [-Wstringop-overread] warn in test_process_vm_readv() +- f2fs: quota: fix potential deadlock +- bpf: Add kconfig knob for disabling unpriv bpf by default +- perf script: Fix CPU filtering of a script's switch events +- net: fix use-after-free in tw_timer_handler +- Input: spaceball - fix parsing of movement data packets +- Input: appletouch - initialize work before device registration +- scsi: vmw_pvscsi: Set residual data length conditionally +- binder: fix async_free_space accounting for empty parcels +- usb: mtu3: set interval of FS intr and isoc endpoint +- usb: mtu3: fix list_head check warning +- usb: mtu3: add memory barrier before set GPD's HWO +- usb: gadget: f_fs: Clear ffs_eventfd in ffs_data_clear. +- xhci: Fresco FL1100 controller should not have BROKEN_MSI quirk set. +- drm/amdgpu: add support for IP discovery gc_info table v2 +- drm/amdgpu: When the VCN(1.0) block is suspended, powergating is explicitly enabled +- uapi: fix linux/nfc.h userspace compilation errors +- nfc: uapi: use kernel size_t to fix user-space builds +- i2c: validate user data in compat ioctl +- fsl/fman: Fix missing put_device() call in fman_port_probe +- net/ncsi: check for error return from call to nla_put_u32 +- selftests/net: udpgso_bench_tx: fix dst ip argument +- net/mlx5e: Fix wrong features assignment in case of error +- ionic: Initialize the 'lif->dbid_inuse' bitmap +- igc: Fix TX timestamp support for non-MSI-X platforms +- net/smc: fix kernel panic caused by race of smc_sock +- net/smc: don't send CDC/LLC message if link not ready +- net/smc: improved fix wait on already cleared link +- NFC: st21nfca: Fix memory leak in device probe and remove +- net: lantiq_xrx200: fix statistics of received bytes +- net: ag71xx: Fix a potential double free in error handling paths +- net: usb: pegasus: Do not drop long Ethernet frames +- net/smc: fix using of uninitialized completions +- sctp: use call_rcu to free endpoint +- selftests: Calculate udpgso segment count without header adjustment +- udp: using datalen to cap ipv6 udp max gso segments +- net/mlx5e: Fix ICOSQ recovery flow for XSK +- net/mlx5e: Wrap the tx reporter dump callback to extract the sq +- net/mlx5: DR, Fix NULL vs IS_ERR checking in dr_domain_init_resources +- scsi: lpfc: Terminate string in lpfc_debugfs_nvmeio_trc_write() +- selinux: initialize proto variable in selinux_ip_postroute_compat() +- recordmcount.pl: fix typo in s390 mcount regex +- memblock: fix memblock_phys_alloc() section mismatch error +- platform/x86: apple-gmux: use resource_size() with res +- parisc: Clear stale IIR value on instruction access rights trap +- tomoyo: use hwight16() in tomoyo_domain_quota_is_ok() +- tomoyo: Check exceeded quota early in tomoyo_domain_quota_is_ok(). +- Input: i8042 - enable deferred probe quirk for ASUS UM325UA +- Input: i8042 - add deferred probe support +- fs/ntfs3: Add ntfs3 module in openeuler_defconfig +- fs/ntfs3: Add NTFS3 in fs/Kconfig and fs/Makefile +- fs/ntfs3: Fix the issue from backport 5.15 to 5.10 +- fs/ntfs3: Add MAINTAINERS +- fs/ntfs3: Check for NULL pointers in ni_try_remove_attr_list +- fs/ntfs3: Refactor ntfs_read_mft +- fs/ntfs3: Refactor ni_parse_reparse +- fs/ntfs3: Refactor ntfs_create_inode +- fs/ntfs3: Refactor ntfs_readlink_hlp +- fs/ntfs3: Rework ntfs_utf16_to_nls +- fs/ntfs3: Fix memory leak if fill_super failed +- fs/ntfs3: Keep prealloc for all types of files +- fs/ntfs3: Remove unnecessary functions +- fs/ntfs3: Forbid FALLOC_FL_PUNCH_HOLE for normal files +- fs/ntfs3: Refactoring of ntfs_set_ea +- fs/ntfs3: Remove locked argument in ntfs_set_ea +- fs/ntfs3: Use available posix_acl_release instead of ntfs_posix_acl_release +- fs/ntfs3: Check for NULL if ATTR_EA_INFO is incorrect +- fs/ntfs3: Refactoring of ntfs_init_from_boot +- fs/ntfs3: Reject mount if boot's cluster size < media sector size +- fs/ntfs3: Refactoring lock in ntfs_init_acl +- fs/ntfs3: Change posix_acl_equiv_mode to posix_acl_update_mode +- fs/ntfs3: Pass flags to ntfs_set_ea in ntfs_set_acl_ex +- fs/ntfs3: Refactor ntfs_get_acl_ex for better readability +- fs/ntfs3: Move ni_lock_dir and ni_unlock into ntfs_create_inode +- fs/ntfs3: Fix logical error in ntfs_create_inode +- fs/ntfs3: Remove deprecated mount options nls +- fs/ntfs3: Remove a useless shadowing variable +- fs/ntfs3: Remove a useless test in 'indx_find()' +- fs/ntfs3: Add sync flag to ntfs_sb_write_run and al_update +- fs/ntfs3: Change max hardlinks limit to 4000 +- fs/ntfs3: Fix insertion of attr in ni_ins_attr_ext +- fs/ntfs3: Fix a memory leak on object opts +- Doc/fs/ntfs3: Fix rst format and make it cleaner +- fs/ntfs3: Initiliaze sb blocksize only in one place + refactor +- fs/ntfs3: Initialize pointer before use place in fill_super +- fs/ntfs3: Remove tmp pointer upcase in fill_super +- fs/ntfs3: Remove tmp pointer bd_inode in fill_super +- fs/ntfs3: Remove tmp var is_ro in ntfs_fill_super +- fs/ntfs3: Use sb instead of sbi->sb in fill_super +- fs/ntfs3: Remove unnecessary variable loading in fill_super +- fs/ntfs3: Return straight without goto in fill_super +- fs/ntfs3: Remove impossible fault condition in fill_super +- fs/ntfs3: Change EINVAL to ENOMEM when d_make_root fails +- fs/ntfs3: Fix wrong error message $Logfile -> $UpCase +- fs/ntfs3: Use min/max macros instated of ternary operators +- fs/ntfs3: Use clamp/max macros instead of comparisons +- fs/ntfs3: Remove always false condition check +- fs/ntfs3: Fix ntfs_look_for_free_space() does only report -ENOSPC +- fs/ntfs3: Remove tabs before spaces from comment +- fs/ntfs3: Remove braces from single statment block +- fs/ntfs3: Place Comparisons constant right side of the test +- fs/ntfs3: Remove '+' before constant in ni_insert_resident() +- fs/ntfs3: Always use binary search with entry search +- fs/ntfs3: Make binary search to search smaller chunks in beginning +- fs/ntfs3: Limit binary search table size +- fs/ntfs3: Remove unneeded header files from c files +- fs/ntfs3: Change right headers to lznt.c +- fs/ntfs3: Change right headers to upcase.c +- fs/ntfs3: Change right headers to bitfunc.c +- fs/ntfs3: Add missing header and guards to lib/ headers +- fs/ntfs3: Add missing headers and forward declarations to ntfs_fs.h +- fs/ntfs3: Add missing header files to ntfs.h +- fs/ntfs3. Add forward declarations for structs to debug.h +- fs/ntfs3: Remove redundant initialization of variable err +- fs/ntfs3: Show uid/gid always in show_options() +- fs/ntfs3: Rename mount option no_acs_rules > (no)acsrules +- fs/ntfs3: Add iocharset= mount option as alias for nls= +- fs/ntfs3: Make mount option nohidden more universal +- fs/ntfs3: Init spi more in init_fs_context than fill_super +- fs/ntfs3: Use new api for mounting +- fs/ntfs3: Convert mount options to pointer in sbi +- fs/ntfs3: Remove unnecesarry remount flag handling +- fs/ntfs3: Remove unnecesarry mount option noatime +- fs/ntfs3: Change how module init/info messages are displayed +- fs/ntfs3: Remove GPL boilerplates from decompress lib files +- fs/ntfs3: Remove unnecessary condition checking from ntfs_file_read_iter +- fs/ntfs3: Fix integer overflow in ni_fiemap with fiemap_prep() +- fs/ntfs3: Restyle comments to better align with kernel-doc +- fs/ntfs3: Rework file operations +- fs/ntfs3: Remove fat ioctl's from ntfs3 driver for now +- fs/ntfs3: Restyle comments to better align with kernel-doc +- fs/ntfs3: Fix error handling in indx_insert_into_root() +- fs/ntfs3: Potential NULL dereference in hdr_find_split() +- fs/ntfs3: Fix error code in indx_add_allocate() +- fs/ntfs3: fix an error code in ntfs_get_acl_ex() +- fs/ntfs3: add checks for allocation failure +- fs/ntfs3: Use kcalloc/kmalloc_array over kzalloc/kmalloc +- fs/ntfs3: Do not use driver own alloc wrappers +- fs/ntfs3: Use kernel ALIGN macros over driver specific +- fs/ntfs3: Restyle comment block in ni_parse_reparse() +- fs/ntfs3: Remove unused including +- fs/ntfs3: Fix fall-through warnings for Clang +- fs/ntfs3: Fix one none utf8 char in source file +- fs/ntfs3: Remove unused variable cnt in ntfs_security_init() +- fs/ntfs3: Fix integer overflow in multiplication +- fs/ntfs3: Add ifndef + define to all header files +- fs/ntfs3: Use linux/log2 is_power_of_2 function +- fs/ntfs3: Fix various spelling mistakes +- fs/ntfs3: Add Kconfig, Makefile and doc +- fs/ntfs3: Add NTFS journal +- fs/ntfs3: Add compression +- fs/ntfs3: Add attrib operations +- fs/ntfs3: Add file operations and implementation +- fs/ntfs3: Add bitmap +- fs/ntfs3: Add initialization of super block +- fs/ntfs3: Add headers and misc files +- openeuler_defconfig: Enable CONFIG_DEBUG_INFO_BTF +- Revert "openeuler_defconfig: Enable CONFIG_DEBUG_INFO_BTF" +- change x86 configs +- change arm64 configs +- mm/damon: hide kernel pointer from tracepoint event +- mm/damon/vaddr: hide kernel pointer from damon_va_three_regions() failure log +- mm/damon/vaddr: use pr_debug() for damon_va_three_regions() failure logging +- mm/damon/dbgfs: remove an unnecessary variable +- mm/damon: move the implementation of damon_insert_region to damon.h +- mm/damon: add access checking for hugetlb pages +- Docs/admin-guide/mm/damon/usage: update for schemes statistics +- mm/damon/dbgfs: support all DAMOS stats +- Docs/admin-guide/mm/damon/reclaim: document statistics parameters +- mm/damon/reclaim: provide reclamation statistics +- mm/damon/schemes: account how many times quota limit has exceeded +- mm/damon/schemes: account scheme actions that successfully applied +- mm/damon: remove a mistakenly added comment for a future feature +- Docs/admin-guide/mm/damon/usage: update for kdamond_pid and (mk|rm)_contexts +- Docs/admin-guide/mm/damon/usage: mention tracepoint at the beginning +- Docs/admin-guide/mm/damon/usage: remove redundant information +- Docs/admin-guide/mm/damon/usage: update for scheme quotas and watermarks +- mm/damon: convert macro functions to static inline functions +- mm/damon: modify damon_rand() macro to static inline function +- mm/damon: move damon_rand() definition into damon.h +- mm/damon/schemes: add the validity judgment of thresholds +- mm/damon/vaddr: remove swap_ranges() and replace it with swap() +- mm/damon: remove some unneeded function definitions in damon.h +- mm/damon/core: use abs() instead of diff_of() +- mm/damon: add 'age' of region tracepoint support +- mm/damon: unified access_check function naming rules +- mm/damon/dbgfs: fix 'struct pid' leaks in 'dbgfs_target_ids_write()' +- mm/damon/dbgfs: protect targets destructions with kdamond_lock +- selftests/damon: split test cases +- selftests/damon: test debugfs file reads/writes with huge count +- selftests/damon: test wrong DAMOS condition ranges input +- selftests/damon: test DAMON enabling with empty target_ids case +- selftests/damon: skip test if DAMON is running +- mm/damon/vaddr-test: remove unnecessary variables +- mm/damon/vaddr-test: split a test function having >1024 bytes frame size +- mm/damon/vaddr: remove an unnecessary warning message +- mm/damon/core: remove unnecessary error messages +- mm/damon/dbgfs: remove an unnecessary error message +- mm/damon/core: use better timer mechanisms selection threshold +- mm/damon/core: fix fake load reports due to uninterruptible sleeps +- timers: implement usleep_idle_range() +- mm/damon/dbgfs: fix missed use of damon_dbgfs_lock +- mm/damon/dbgfs: use '__GFP_NOWARN' for user-specified size buffer allocation +- NFC: add necessary privilege flags in netlink layer +- net: add and use skb_unclone_keeptruesize() helper +- openeuler_defconfig: Enable CONFIG_DEBUG_INFO_BTF +- tools/bpftool: Fix cross-build +- tools/bpftool: Force clean of out-of-tree build +- x86/kdump: add log before booting crash kernel +- selftests/x86: Test signal frame XSTATE header corruption handling +- x86/fpu: Add address range checks to copy_user_to_xstate() +- block, bfq: move bfqq to root_group if parent group is offlined +- ext4: report error to userspace by netlink +- crypto: Add PMULL judgment during initialization to prevent oops +- phonet/pep: refuse to enable an unbound pipe +- hamradio: improve the incomplete fix to avoid NPD +- hamradio: defer ax25 kfree after unregister_netdev +- ax25: NPD bug when detaching AX25 device +- hwmon: (lm90) Do not report 'busy' status bit as alarm +- hwmom: (lm90) Fix citical alarm status for MAX6680/MAX6681 +- pinctrl: mediatek: fix global-out-of-bounds issue +- ASoC: rt5682: fix the wrong jack type detected +- ASoC: tas2770: Fix setting of high sample rates +- Input: goodix - add id->model mapping for the "9111" model +- Input: elants_i2c - do not check Remark ID on eKTH3900/eKTH5312 +- mm: mempolicy: fix THP allocations escaping mempolicy restrictions +- KVM: VMX: Fix stale docs for kvm-intel.emulate_invalid_guest_state +- usb: gadget: u_ether: fix race in setting MAC address in setup phase +- ceph: fix up non-directory creation in SGID directories +- tee: optee: Fix incorrect page free bug +- mac80211: fix locking in ieee80211_start_ap error path +- ARM: 9169/1: entry: fix Thumb2 bug in iWMMXt exception handling +- mmc: mmci: stm32: clear DLYB_CR after sending tuning command +- mmc: core: Disable card detect during shutdown +- mmc: meson-mx-sdhc: Set MANUAL_STOP for multi-block SDIO commands +- mmc: sdhci-tegra: Fix switch to HS400ES mode +- gpio: dln2: Fix interrupts when replugging the device +- pinctrl: stm32: consider the GPIO offset to expose all the GPIO lines +- KVM: VMX: Wake vCPU when delivering posted IRQ even if vCPU == this vCPU +- platform/x86: intel_pmc_core: fix memleak on registration failure +- x86/pkey: Fix undefined behaviour with PKRU_WD_BIT +- parisc: Fix mask used to select futex spinlock +- parisc: Correct completer in lws start +- ipmi: fix initialization when workqueue allocation fails +- ipmi: ssif: initialize ssif_info->client early +- ipmi: bail out if init_srcu_struct fails +- Input: atmel_mxt_ts - fix double free in mxt_read_info_block +- ASoC: meson: aiu: Move AIU_I2S_MISC hold setting to aiu-fifo-i2s +- ALSA: hda/realtek: Fix quirk for Clevo NJ51CU +- ALSA: hda/realtek: Add new alc285-hp-amp-init model +- ALSA: hda/realtek: Amp init fixup for HP ZBook 15 G6 +- ALSA: drivers: opl3: Fix incorrect use of vp->state +- ALSA: jack: Check the return value of kstrdup() +- hwmon: (lm90) Drop critical attribute support for MAX6654 +- hwmon: (lm90) Add basic support for TI TMP461 +- hwmon: (lm90) Introduce flag indicating extended temperature support +- hwmon: (lm90) Fix usage of CONFIG2 register in detect function +- pinctrl: bcm2835: Change init order for gpio hogs +- Input: elantech - fix stack out of bound access in elantech_change_report_id() +- sfc: falcon: Check null pointer of rx_queue->page_ring +- sfc: Check null pointer of rx_queue->page_ring +- net: ks8851: Check for error irq +- drivers: net: smc911x: Check for error irq +- fjes: Check for error irq +- bonding: fix ad_actor_system option setting to default +- ipmi: Fix UAF when uninstall ipmi_si and ipmi_msghandler module +- igb: fix deadlock caused by taking RTNL in RPM resume path +- net: skip virtio_net_hdr_set_proto if protocol already set +- net: accept UFOv6 packages in virtio_net_hdr_to_skb +- qlcnic: potential dereference null pointer of rx_queue->page_ring +- net: marvell: prestera: fix incorrect return of port_find +- ARM: dts: imx6qdl-wandboard: Fix Ethernet support +- RDMA/hns: Replace kfree() with kvfree() +- IB/qib: Fix memory leak in qib_user_sdma_queue_pkts() +- ASoC: meson: aiu: fifo: Add missing dma_coerce_mask_and_coherent() +- spi: change clk_disable_unprepare to clk_unprepare +- arm64: dts: allwinner: orangepi-zero-plus: fix PHY mode +- HID: potential dereference of null pointer +- HID: holtek: fix mouse probing +- net: usb: lan78xx: add Allied Telesis AT29M2-AF +- arm64: vdso32: require CROSS_COMPILE_COMPAT for gcc+bfd +- arm64: vdso32: drop -no-integrated-as flag +- mm/shmem.c: fix judgment error in shmem_is_huge() +- drm: fix free illegal pointer when create drm_property_blob failed +- BMA: Fix pointer cast compile warning in arm32 builds +- arm64: openeuler_defconfig: Enable ARM64_PMEM_LEGACY +- arm64: register persistent memory via protected memory +- x86: pmem: move persistent memory(legacy) code into nvdimm +- openeuler_defconfig: enable CONFIG_VENDOR_HOOKS for x86 and arm64 +- vendor_hooks: make android vendor hooks feature generic. +- ANDROID: fixup restricted hooks after tracepont refactoring +- tracepoints: Do not punish non static call users +- tracepoints: Remove unnecessary "data_args" macro parameter +- ANDROID: simplify vendor hooks for non-GKI builds +- ANDROID: vendor_hooks: fix __section macro +- ANDROID: use static_call() for restricted hooks +- ANDROID: fix redefinition error for restricted vendor hooks +- ANDROID: add support for vendor hooks +- mm: add PG_pool in /proc/kpageflags +- ext4: Fix BUG_ON in ext4_bread when write quota data +- ext4: fix null-ptr-deref in '__ext4_journal_ensure_credits' +- bpf, mm: Fix lockdep warning triggered by stack_map_get_build_id_offset() +- mmap_lock: change trace and locking order +- mm: mmap_lock: fix disabling preemption directly +- mm/mmap_lock: remove dead code for !CONFIG_TRACING configurations +- mm: mmap_lock: use local locks instead of disabling preemption +- mm: mmap_lock: add tracepoints around lock acquisition +- ext4: fix an use-after-free issue about data=journal writeback mode +- mm/pin_mem: improve pin mem pages rmap and free method +- mm/pin_mem: add PG_hotreplace to mark pages need hotreplaced +- mm/pin_mem: refactor pin memory mem reserve and pid reserve code +- audit: bugfix for infinite loop when flush the hold queue +- iommu/arm-smmu-v3: Remove arm_smmu_cmdq_issue_sync() to keep consistent with upstream +- ipvlan: disable l2e local xmit +- watchdog: Fix sleeping function called from atomic context +- tcp_comp: Del compressed_data and remaining_data from tcp_comp_context_rx +- tcp_comp: Add dpkt to save decompressed skb +- tcp_comp: Fix ZSTD_decompressStream failed +- tcp_comp: Fix comp_read_size return value +- tcp_comp: Avoiding the null pointer problem of ctx in comp_stream_read +- tcp_comp: open configs for tcp compression +- tcp_comp: implement recvmsg for tcp compression +- tcp_comp: implement sendmsg for tcp compression +- Revert "sched: Introcude config option SCHED_OPTIMIZE_LOAD_TRACKING" +- Revert "sched: Add switch for update_blocked_averages" +- Revert "sched: Add frequency control for load update in scheduler_tick" +- Revert "sched: Access control for sysctl_update_load_latency" +- Revert "sched: Fix branch prediction error in static_key" +- Revert "arm: Optimize ttwu IPI" +- Revert "sched/idle: introduce smart halt polling" +- Revert "sched/idle: Add IAS_SMART_HALT_POLL config for smart halt polling feature" +- Revert "sched: Add menuconfig option for CONFIG_SCHED_OPTIMIZE_LOAD_TRACKING" +- Revert "sysctl: Refactor IAS framework" +- Revert "sched/idle: Optimize the loop time algorithm to reduce multicore disturb" +- Revert "sched/idle: Reported an error when an illegal negative value is passed" +- Revert "sched: Aware multi-core system for optimize loadtracking" +- blk-throttle: enable hierarchical throttle in cgroup v1 +- md: Fix undefined behaviour in is_mddev_idle +- cgroup: fix compile error when CONFIG_MEMCG = n +- xfs: map unwritten blocks in XFS_IOC_{ALLOC,FREE}SP just like fallocate +- fbcon: fix ypos over boundary issue +- mm/zswap: move to use crypto_acomp API for hardware acceleration +- net: fix a data race when get vlan device +- ipvlan: Add handling of NETDEV_UP events +- perf vendor events amd: Add Zen3 events + +* Wed Jan 19 2022 Zheng Zengkai - 5.10.0-42.0.0.24 +- Disable-SATA-disk-phy-for-severe-I_T-nexus reset failure +- Export-sas_phy_enable +- bonding: allow nesting of bonding device +- bonding: avoid adding slave device with IFF_MASTER flag +- bonding: 3ad: Fix the conflict between bond_update_slave_arr and the state machine +- openeuler_defconfig: enable CONFIG_DYNAMIC_HUGETLB for x86 +- mm/dynamic_hugetlb: add Document for dynamic hugetlb feature +- mm/dynamic_hugetlb: disable dynamic hugetlb if hugetlb_vmemmap is enabled +- mm/huge_memory: disable THP when dynamic hugetlb is enabled +- mm/dynamic_hugetlb: add some tracepoints +- mm/dynamic_hugetlb: free huge pages to dhugetlb_pool +- mm/dynamic_hugetlb: alloc huge pages from dhugetlb_pool +- mm/dynamic_hugetlb: collects resv allocated for dhugetlb_pool +- mm/dynamic_hugetlb: add interface to disable normal pages allocation +- mm/dynamic_hugetlb: free pages to dhugetlb_pool +- mm/dynamic_hugetlb: alloc page from dhugetlb_pool +- mm/dynamic_hugetlb: add migration function +- mm/dynamic_hugetlb: add merge page function +- mm/dynamic_hugetlb: add split page function +- mm/dynamic_hugetlb: add interface to configure the count of hugepages +- mm/dynamic_hugetlb: add PG_pool flag to mark pages from dhugetlb_pool +- mm/dynamic_hugetlb: establish the dynamic hugetlb feature framework +- mm/hugetlb: add parameter hugetlbfs_inode_info to several functions +- mm: declare several functions + +* Tue Jan 18 2022 Zheng Zengkai - 5.10.0-41.0.0.23 +- SCSI: spfc: Update lb mode acquired solution +- cpufreq: intel_pstate: Add Icelake servers support in no-HWP mode +- asm-generic: Add missing brackets for io_stop_wc macro +- net: hns3: add ethtool priv-flag for TX push +- net: hns3: add support for TX push mode +- asm-generic: introduce io_stop_wc() and add implementation for ARM64 +- net/spnic:Remove the code about little endian and big endian conversion +- net/spnic:Remove the code of polling mode +- net/spnic:Remove unused clp hardware channels +- net/spnic:Remove unused functions about ceq +- RDMA/hns: Replace get_udp_sport with rdma_get_udp_sport +- RDMA/core: Calculate UDP source port based on flow label or lqpn/rqpn +- RDMA/hns: Modify the hop num of HIP09 EQ to 1 +- RDMA/hns: Remove magic number +- RDMA/hns: Remove macros that are no longer used +- RDMA/hns: Correctly initialize the members of Array[][] +- RDMA/hns: Correct the type of variables participating in the shift operation +- RDMA/hns: Replace tab with space in the right-side comments +- RDMA/hns: Correct the print format to be consistent with the variable type +- RDMA/hns: Correct the hex print format +- RDMA/hns: Validate the pkey index +- RDMA/hns: Modify the value of MAX_LP_MSG_LEN to meet hardware compatibility +- RDMA/hns: Fix initial arm_st of CQ +- RDMA: Constify netdev->dev_addr accesses +- RDMA/hns: Use dma_alloc_coherent() instead of kmalloc/dma_map_single() +- RDMA/hns: Add the check of the CQE size of the user space +- RDMA/hns: Fix the size setting error when copying CQE in clean_cq() +- RDMA/hns: Work around broken constant propagation in gcc 8 +- RDMA/hns: Delete unnecessary blank lines. +- RDMA/hns: Adjust the order in which irq are requested and enabled +- RDMA/hns: Remove dqpn filling when modify qp from Init to Init +- RDMA/hns: Fix query destination qpn +- RDMA/hns: Bugfix for incorrect association between dip_idx and dgid +- RDMA/hns: Bugfix for the missing assignment for dip_idx +- RDMA/hns: Bugfix for data type of dip_idx +- RDMA/hns: Fix incorrect lsn field +- RDMA/hns: Delete unused hns bitmap interface +- RDMA/hns: Use IDA interface to manage srq index +- RDMA/hns: Ownerbit mode add control field +- RDMA/hns: Remove unsupport cmdq mode +- RDMA/hns: Don't overwrite supplied QP attributes +- RDMA/hns: Fix the double unlock problem of poll_sem +- hugetlbfs: fix issue of preallocation of gigantic pages can't work +- hugetlbfs: extend the definition of hugepages parameter to support node allocation +- cpupower: Add cpuid cap flag for MSR_AMD_HWCR support +- cpupower: Remove family arg to decode_pstates() +- cpupower: Condense pstate enabled bit checks in decode_pstates() +- cpupower: Update family checks when decoding HW pstates +- cpupower: Remove unused pscur variable. +- cpupower: Add CPUPOWER_CAP_AMD_HW_PSTATE cpuid caps flag +- cpupower: Correct macro name for CPB caps flag +- cpupower: Update msr_pstate union struct naming +- openeuler_defconfig: Enable CONFIG_ARM64_EPAN for ARM64 +- arm64: Support execute-only permissions with Enhanced PAN +- arm64: head.S: cleanup SCTLR_ELx initialization +- arm64: smccc: Save lr before calling __arm_smccc_sve_check() +- arm64: smccc: Support SMCCC v1.3 SVE register saving hint +- KVM: arm64: Implement the TRNG hypervisor call +- arm64: Add support for SMCCC TRNG entropy source +- firmware: smccc: Introduce SMCCC TRNG framework +- firmware: smccc: Add SMCCC TRNG function call IDs +- arm64: abort counter_read_on_cpu() when irqs_disabled() +- arm64: implement CPPC FFH support using AMUs +- arm64: split counter validation function +- arm64: wrap and generalise counter read functions +- arm64: Add HWCAP for self-synchronising virtual counter +- arm64: Add handling of CNTVCTSS traps +- arm64: Add CNT{P,V}CTSS_EL0 alternatives to cnt{p,v}ct_el0 +- arm64: Add a capability for FEAT_ECV +- clocksource/drivers/arch_arm_timer: Move workaround synchronisation around +- clocksource/drivers/arm_arch_timer: Fix masking for high freq counters +- clocksource/drivers/arm_arch_timer: Drop unnecessary ISB on CVAL programming +- clocksource/drivers/arm_arch_timer: Remove any trace of the TVAL programming interface +- clocksource/drivers/arm_arch_timer: Work around broken CVAL implementations +- clocksource/drivers/arm_arch_timer: Advertise 56bit timer to the core code +- clocksource/drivers/arm_arch_timer: Move MMIO timer programming over to CVAL +- clocksource/drivers/arm_arch_timer: Fix MMIO base address vs callback ordering issue +- clocksource/drivers/arm_arch_timer: Move drop _tval from erratum function names +- clocksource/drivers/arm_arch_timer: Move system register timer programming over to CVAL +- clocksource/drivers/arm_arch_timer: Extend write side of timer register accessors to u64 +- clocksource/drivers/arm_arch_timer: Drop CNT*_TVAL read accessors +- clocksource/arm_arch_timer: Add build-time guards for unhandled register accesses +- can: raw: return -ERANGE when filterset does not fit into user space buffer +- x86: hugepage: use nt copy hugepage to AEP in x86 + +* Fri Jan 14 2022 Zheng Zengkai - 5.10.0-40.0.0.22 +- xen/netback: don't queue unlimited number of packages +- xen/netback: fix rx queue stall detection +- xen/console: harden hvc_xen against event channel storms +- xen/netfront: harden netfront against event channel storms +- xen/blkfront: harden blkfront against event channel storms +- Revert "xsk: Do not sleep in poll() when need_wakeup set" +- bus: ti-sysc: Fix variable set but not used warning for reinit_modules +- rcu: Mark accesses to rcu_state.n_force_qs +- scsi: scsi_debug: Sanity check block descriptor length in resp_mode_select() +- scsi: scsi_debug: Fix type in min_t to avoid stack OOB +- scsi: scsi_debug: Don't call kcalloc() if size arg is zero +- ovl: fix warning in ovl_create_real() +- fuse: annotate lock in fuse_reverse_inval_entry() +- media: mxl111sf: change mutex_init() location +- xsk: Do not sleep in poll() when need_wakeup set +- ARM: dts: imx6ull-pinfunc: Fix CSI_DATA07__ESAI_TX0 pad name +- Input: touchscreen - avoid bitwise vs logical OR warning +- drm/amdgpu: correct register access for RLC_JUMP_TABLE_RESTORE +- libata: if T_LENGTH is zero, dma direction should be DMA_NONE +- serial: 8250_fintek: Fix garbled text for console +- iocost: Fix divide-by-zero on donation from low hweight cgroup +- zonefs: add MODULE_ALIAS_FS +- btrfs: fix double free of anon_dev after failure to create subvolume +- btrfs: fix memory leak in __add_inode_ref() +- USB: serial: option: add Telit FN990 compositions +- USB: serial: cp210x: fix CP2105 GPIO registration +- usb: xhci: Extend support for runtime power management for AMD's Yellow carp. +- PCI/MSI: Mask MSI-X vectors only on success +- PCI/MSI: Clear PCI_MSIX_FLAGS_MASKALL on error +- usb: dwc2: fix STM ID/VBUS detection startup delay in dwc2_driver_probe +- USB: NO_LPM quirk Lenovo USB-C to Ethernet Adapher(RTL8153-04) +- tty: n_hdlc: make n_hdlc_tty_wakeup() asynchronous +- KVM: x86: Drop guest CPUID check for host initiated writes to MSR_IA32_PERF_CAPABILITIES +- Revert "usb: early: convert to readl_poll_timeout_atomic()" +- bpf, selftests: Fix racing issue in btf_skc_cls_ingress test +- sit: do not call ipip6_dev_free() from sit_init_net() +- net: systemport: Add global locking for descriptor lifecycle +- net/smc: Prevent smc_release() from long blocking +- net: Fix double 0x prefix print in SKB dump +- sfc_ef100: potential dereference of null pointer +- net/packet: rx_owner_map depends on pg_vec +- ixgbe: set X550 MDIO speed before talking to PHY +- ixgbe: Document how to enable NBASE-T support +- igc: Fix typo in i225 LTR functions +- igbvf: fix double free in `igbvf_probe` +- igb: Fix removal of unicast MAC filters of VFs +- soc/tegra: fuse: Fix bitwise vs. logical OR warning +- mptcp: clear 'kern' flag from fallback sockets +- drm/amd/pm: fix a potential gpu_metrics_table memory leak +- flow_offload: return EOPNOTSUPP for the unsupported mpls action type +- mac80211: fix lookup when adding AddBA extension element +- mac80211: agg-tx: don't schedule_and_wake_txq() under sta->lock +- drm/ast: potential dereference of null pointer +- selftest/net/forwarding: declare NETIFS p9 p10 +- net/sched: sch_ets: don't remove idle classes from the round-robin list +- dmaengine: st_fdma: fix MODULE_ALIAS +- selftests: Fix IPv6 address bind tests +- selftests: Fix raw socket bind tests with VRF +- selftests: Add duplicate config only for MD5 VRF tests +- net: hns3: fix use-after-free bug in hclgevf_send_mbx_msg +- inet_diag: fix kernel-infoleak for UDP sockets +- sch_cake: do not call cake_destroy() from cake_init() +- s390/kexec_file: fix error handling when applying relocations +- selftests: net: Correct ping6 expected rc from 2 to 1 +- virtio/vsock: fix the transport to work with VMADDR_CID_ANY +- soc: imx: Register SoC device only on i.MX boards +- clk: Don't parent clks until the parent is fully registered +- ARM: socfpga: dts: fix qspi node compatible +- ceph: initialize pathlen variable in reconnect_caps_cb +- ceph: fix duplicate increment of opened_inodes metric +- tee: amdtee: fix an IS_ERR() vs NULL bug +- mac80211: track only QoS data frames for admission control +- arm64: dts: rockchip: fix audio-supply for Rock Pi 4 +- arm64: dts: rockchip: fix rk3399-leez-p710 vcc3v3-lan supply +- arm64: dts: rockchip: fix rk3308-roc-cc vcc-sd supply +- arm64: dts: rockchip: remove mmc-hs400-enhanced-strobe from rk3399-khadas-edge +- arm64: dts: imx8mp-evk: Improve the Ethernet PHY description +- arm64: dts: imx8m: correct assigned clocks for FEC +- dm btree remove: fix use after free in rebalance_children() +- recordmcount.pl: look for jgnop instruction as well as bcrl on s390 +- vdpa: check that offsets are within bounds +- virtio_ring: Fix querying of maximum DMA mapping size for virtio device +- bpf, selftests: Add test case trying to taint map value pointer +- bpf: Make 32->64 bounds propagation slightly more robust +- bpf: Fix signed bounds propagation after mov32 +- firmware: arm_scpi: Fix string overflow in SCPI genpd driver +- mac80211: validate extended element ID is present +- mac80211: send ADDBA requests using the tid/queue of the aggregation session +- mac80211: mark TX-during-stop for TX in in_reconfig +- mac80211: fix regression in SSN handling of addba tx +- KVM: downgrade two BUG_ONs to WARN_ON_ONCE +- KVM: selftests: Make sure kvm_create_max_vcpus test won't hit RLIMIT_NOFILE +- arm: ioremap: don't abuse pfn_valid() to check if pfn is in RAM +- arm: extend pfn_valid to take into account freed memory map alignment +- memblock: align freed memory map on pageblock boundaries with SPARSEMEM +- memblock: free_unused_memmap: use pageblock units instead of MAX_ORDER +- perf intel-pt: Fix error timestamp setting on the decoder error path +- perf intel-pt: Fix missing 'instruction' events with 'q' option +- perf intel-pt: Fix next 'err' value, walking trace +- perf intel-pt: Fix state setting when receiving overflow (OVF) packet +- perf intel-pt: Fix intel_pt_fup_event() assumptions about setting state type +- perf intel-pt: Fix sync state when a PSB (synchronization) packet is found +- perf intel-pt: Fix some PGE (packet generation enable/control flow packets) usage +- perf inject: Fix itrace space allowed for new attributes +- ethtool: do not perform operations on net devices being unregistered +- hwmon: (dell-smm) Fix warning on /proc/i8k creation error +- fuse: make sure reclaim doesn't write the inode +- bpf: Fix integer overflow in argument calculation for bpf_map_area_alloc +- staging: most: dim2: use device release method +- KVM: x86: Ignore sparse banks size for an "all CPUs", non-sparse IPI req +- tracing: Fix a kmemleak false positive in tracing_map +- drm/amd/display: add connector type check for CRC source set +- drm/amd/display: Fix for the no Audio bug with Tiled Displays +- net: netlink: af_netlink: Prevent empty skb by adding a check on len. +- i2c: rk3x: Handle a spurious start completion interrupt flag +- parisc/agp: Annotate parisc agp init functions with __init +- ALSA: hda/hdmi: fix HDA codec entry table order for ADL-P +- ALSA: hda: Add Intel DG2 PCI ID and HDMI codec vid +- net/mlx4_en: Update reported link modes for 1/10G +- Revert "tty: serial: fsl_lpuart: drop earlycon entry for i.MX8QXP" +- s390/test_unwind: use raw opcode instead of invalid instruction +- KVM: arm64: Save PSTATE early on exit +- drm/msm/dsi: set default num_data_lanes +- nfc: fix segfault in nfc_genl_dump_devices_done +- cgroup: Use open-time cgroup namespace for process migration perm checks +- cgroup: Allocate cgroup_file_ctx for kernfs_open_file->priv +- cgroup: Use open-time credentials for process migraton perm checks +- cgroup/cgroup.c: replace 'of->kn->priv' with of_cft() +- cgroup: cgroup.{procs,threads} factor out common parts +- netfilter: selftest: conntrack_vrf.sh: fix file permission +- Documentation/Kbuild: Remove references to gcc-plugin.sh +- MAINTAINERS: adjust GCC PLUGINS after gcc-plugin.sh removal +- doc: gcc-plugins: update gcc-plugins.rst +- kbuild: simplify GCC_PLUGINS enablement in dummy-tools/gcc +- bpf: Add selftests to cover packet access corner cases +- misc: fastrpc: fix improper packet size calculation +- irqchip: nvic: Fix offset for Interrupt Priority Offsets +- irqchip/irq-gic-v3-its.c: Force synchronisation when issuing INVALL +- irqchip/armada-370-xp: Fix support for Multi-MSI interrupts +- irqchip/armada-370-xp: Fix return value of armada_370_xp_msi_alloc() +- irqchip/aspeed-scu: Replace update_bits with write_bits. +- csky: fix typo of fpu config macro +- iio: accel: kxcjk-1013: Fix possible memory leak in probe and remove +- iio: ad7768-1: Call iio_trigger_notify_done() on error +- iio: adc: axp20x_adc: fix charging current reporting on AXP22x +- iio: adc: stm32: fix a current leak by resetting pcsel before disabling vdda +- iio: at91-sama5d2: Fix incorrect sign extension +- iio: dln2: Check return value of devm_iio_trigger_register() +- iio: dln2-adc: Fix lockdep complaint +- iio: itg3200: Call iio_trigger_notify_done() on error +- iio: kxsd9: Don't return error code in trigger handler +- iio: ltr501: Don't return error code in trigger handler +- iio: mma8452: Fix trigger reference couting +- iio: stk3310: Don't return error code in interrupt handler +- iio: trigger: stm32-timer: fix MODULE_ALIAS +- iio: trigger: Fix reference counting +- iio: gyro: adxrs290: fix data signedness +- xhci: avoid race between disable slot command and host runtime suspend +- usb: core: config: using bit mask instead of individual bits +- xhci: Remove CONFIG_USB_DEFAULT_PERSIST to prevent xHCI from runtime suspending +- usb: core: config: fix validation of wMaxPacketValue entries +- USB: gadget: zero allocate endpoint 0 buffers +- selftests/fib_tests: Rework fib_rp_filter_test() +- net/qla3xxx: fix an error code in ql_adapter_up() +- net, neigh: clear whole pneigh_entry at alloc time +- net: fec: only clear interrupt of handling queue in fec_enet_rx_queue() +- net: altera: set a couple error code in probe() +- net: cdc_ncm: Allow for dwNtbOutMaxSize to be unset or zero +- tools build: Remove needless libpython-version feature check that breaks test-all fast path +- dt-bindings: net: Reintroduce PHY no lane swap binding +- Documentation/locking/locktypes: Update migrate_disable() bits. +- perf tools: Fix SMT detection fast read path +- Revert "PCI: aardvark: Fix support for PCI_ROM_ADDRESS1 on emulated bridge" +- i40e: Fix NULL pointer dereference in i40e_dbg_dump_desc +- mtd: rawnand: fsmc: Fix timing computation +- mtd: rawnand: fsmc: Take instruction delay into account +- i40e: Fix pre-set max number of queues for VF +- i40e: Fix failed opcode appearing if handling messages from VF +- clk: imx: use module_platform_driver +- RDMA/hns: Do not destroy QP resources in the hw resetting phase +- RDMA/hns: Do not halt commands during reset until later +- ASoC: codecs: wcd934x: return correct value from mixer put +- ASoC: codecs: wcd934x: handle channel mappping list correctly +- ASoC: codecs: wsa881x: fix return values from kcontrol put +- ASoC: qdsp6: q6routing: Fix return value from msm_routing_put_audio_mixer +- ASoC: rt5682: Fix crash due to out of scope stack vars +- PM: runtime: Fix pm_runtime_active() kerneldoc comment +- qede: validate non LSO skb length +- scsi: scsi_debug: Fix buffer size of REPORT ZONES command +- scsi: pm80xx: Do not call scsi_remove_host() in pm8001_alloc() +- block: fix ioprio_get(IOPRIO_WHO_PGRP) vs setuid(2) +- tracefs: Set all files to the same group ownership as the mount option +- net: mvpp2: fix XDP rx queues registering +- aio: fix use-after-free due to missing POLLFREE handling +- aio: keep poll requests on waitqueue until completed +- signalfd: use wake_up_pollfree() +- binder: use wake_up_pollfree() +- wait: add wake_up_pollfree() +- libata: add horkage for ASMedia 1092 +- can: m_can: Disable and ignore ELO interrupt +- can: pch_can: pch_can_rx_normal: fix use after free +- drm/syncobj: Deal with signalled fences in drm_syncobj_find_fence. +- clk: qcom: regmap-mux: fix parent clock lookup +- mmc: renesas_sdhi: initialize variable properly when tuning +- tracefs: Have new files inherit the ownership of their parent +- nfsd: Fix nsfd startup race (again) +- nfsd: fix use-after-free due to delegation race +- md: fix update super 1.0 on rdev size change +- btrfs: replace the BUG_ON in btrfs_del_root_ref with proper error handling +- btrfs: clear extent buffer uptodate when we fail to write it +- scsi: qla2xxx: Format log strings only if needed +- ALSA: pcm: oss: Handle missing errors in snd_pcm_oss_change_params*() +- ALSA: pcm: oss: Limit the period size to 16MB +- ALSA: pcm: oss: Fix negative period/buffer sizes +- ALSA: hda/realtek: Fix quirk for TongFang PHxTxX1 +- ALSA: hda/realtek - Add headset Mic support for Lenovo ALC897 platform +- ALSA: ctl: Fix copy of updated id with element read/write +- mm: bdi: initialize bdi_min_ratio when bdi is unregistered +- KVM: x86: Wait for IPIs to be delivered when handling Hyper-V TLB flush hypercall +- net/sched: fq_pie: prevent dismantle issue +- devlink: fix netns refcount leak in devlink_nl_cmd_reload() +- IB/hfi1: Correct guard on eager buffer deallocation +- iavf: Fix reporting when setting descriptor count +- iavf: restore MSI state on reset +- netfilter: conntrack: annotate data-races around ct->timeout +- udp: using datalen to cap max gso segments +- seg6: fix the iif in the IPv6 socket control block +- nfp: Fix memory leak in nfp_cpp_area_cache_add() +- bonding: make tx_rebalance_counter an atomic +- ice: ignore dropped packets during init +- bpf: Fix the off-by-two error in range markings +- bpf, x86: Fix "no previous prototype" warning +- vrf: don't run conntrack on vrf with !dflt qdisc +- selftests: netfilter: add a vrf+conntrack testcase +- nfc: fix potential NULL pointer deref in nfc_genl_dump_ses_done +- drm/amdkfd: fix boot failure when iommu is disabled in Picasso. +- drm/amdgpu: init iommu after amdkfd device init +- drm/amdgpu: move iommu_resume before ip init/resume +- drm/amdgpu: add amdgpu_amdkfd_resume_iommu +- drm/amdkfd: separate kfd_iommu_resume from kfd_resume +- drm/amd/amdkfd: adjust dummy functions' placement +- x86/sme: Explicitly map new EFI memmap table as encrypted +- can: sja1000: fix use after free in ems_pcmcia_add_card() +- can: kvaser_pciefd: kvaser_pciefd_rx_error_frame(): increase correct stats->{rx,tx}_errors counter +- can: kvaser_usb: get CAN clock frequency from device +- IB/hfi1: Fix leak of rcvhdrtail_dummy_kvaddr +- IB/hfi1: Fix early init panic +- IB/hfi1: Insure use of smp_processor_id() is preempt disabled +- nft_set_pipapo: Fix bucket load in AVX2 lookup routine for six 8-bit groups +- HID: check for valid USB device for many HID drivers +- HID: wacom: fix problems when device is not a valid USB device +- HID: bigbenff: prevent null pointer dereference +- HID: add USB_HID dependancy on some USB HID drivers +- HID: add USB_HID dependancy to hid-chicony +- HID: add USB_HID dependancy to hid-prodikeys +- HID: add hid_is_usb() function to make it simpler for USB detection +- HID: google: add eel USB id +- HID: quirks: Add quirk for the Microsoft Surface 3 type-cover +- gcc-plugins: fix gcc 11 indigestion with plugins... +- gcc-plugins: simplify GCC plugin-dev capability test +- usb: gadget: uvc: fix multiple opens +- tee: handle lookup of shm with reference count 0 +- f2fs: fix to do sanity check on last xattr entry in __f2fs_setxattr() +- rds: memory leak in __rds_conn_create() +- ipmi: msghandler: Make symbol 'remove_work_wq' static +- net/tls: Fix authentication failure in CCM mode +- parisc: Mark cr16 CPU clocksource unstable on all SMP machines +- iwlwifi: mvm: retry init flow if failed +- serial: 8250: Fix RTS modem control while in rs485 mode +- serial: 8250_pci: rewrite pericom_do_set_divisor() +- serial: 8250_pci: Fix ACCES entries in pci_serial_quirks array +- serial: core: fix transmit-buffer reset and memleak +- serial: tegra: Change lower tolerance baud rate limit for tegra20 and tegra30 +- serial: pl011: Add ACPI SBSA UART match id +- tty: serial: msm_serial: Deactivate RX DMA for polling support +- x86/64/mm: Map all kernel memory into trampoline_pgd +- x86/tsc: Disable clocksource watchdog for TSC on qualified platorms +- x86/tsc: Add a timer to make sure TSC_adjust is always checked +- usb: typec: tcpm: Wait in SNK_DEBOUNCED until disconnect +- USB: NO_LPM quirk Lenovo Powered USB-C Travel Hub +- xhci: Fix commad ring abort, write all 64 bits to CRCR register. +- vgacon: Propagate console boot parameters before calling `vc_resize' +- parisc: Fix "make install" on newer debian releases +- parisc: Fix KBUILD_IMAGE for self-extracting kernel +- x86/entry: Add a fence for kernel entry SWAPGS in paranoid_entry() +- x86/pv: Switch SWAPGS to ALTERNATIVE +- sched/uclamp: Fix rq->uclamp_max not set on first enqueue +- x86/xen: Add xenpv_restore_regs_and_return_to_usermode() +- x86/entry: Use the correct fence macro after swapgs in kernel CR3 +- x86/sev: Fix SEV-ES INS/OUTS instructions for word, dword, and qword +- KVM: VMX: Set failure code in prepare_vmcs02() +- KVM: x86/pmu: Fix reserved bits for AMD PerfEvtSeln register +- atlantic: Remove warn trace message. +- atlantic: Fix statistics logic for production hardware +- Remove Half duplex mode speed capabilities. +- atlantic: Add missing DIDs and fix 115c. +- atlantic: Fix to display FW bundle version instead of FW mac version. +- atlatnic: enable Nbase-t speeds with base-t +- atlantic: Increase delay for fw transactions +- drm/msm: Do hw_init() before capturing GPU state +- drm/msm/a6xx: Allocate enough space for GMU registers +- net/smc: Keep smc_close_final rc during active close +- net/rds: correct socket tunable error in rds_tcp_tune() +- net/smc: fix wrong list_del in smc_lgr_cleanup_early +- ipv4: convert fib_num_tclassid_users to atomic_t +- net: annotate data-races on txq->xmit_lock_owner +- dpaa2-eth: destroy workqueue at the end of remove function +- net: marvell: mvpp2: Fix the computation of shared CPUs +- net: usb: lan78xx: lan78xx_phy_init(): use PHY_POLL instead of "0" if no IRQ is available +- ALSA: intel-dsp-config: add quirk for CML devices based on ES8336 codec +- rxrpc: Fix rxrpc_local leak in rxrpc_lookup_peer() +- rxrpc: Fix rxrpc_peer leak in rxrpc_look_up_bundle() +- ASoC: tegra: Fix kcontrol put callback in AHUB +- ASoC: tegra: Fix kcontrol put callback in DSPK +- ASoC: tegra: Fix kcontrol put callback in DMIC +- ASoC: tegra: Fix kcontrol put callback in I2S +- ASoC: tegra: Fix kcontrol put callback in ADMAIF +- ASoC: tegra: Fix wrong value type in DSPK +- ASoC: tegra: Fix wrong value type in DMIC +- ASoC: tegra: Fix wrong value type in I2S +- ASoC: tegra: Fix wrong value type in ADMAIF +- mt76: mt7915: fix NULL pointer dereference in mt7915_get_phy_mode +- selftests: net: Correct case name +- net/mlx4_en: Fix an use-after-free bug in mlx4_en_try_alloc_resources() +- arm64: ftrace: add missing BTIs +- siphash: use _unaligned version by default +- net: mpls: Fix notifications when deleting a device +- net: qlogic: qlcnic: Fix a NULL pointer dereference in qlcnic_83xx_add_rings() +- tcp: fix page frag corruption on page fault +- natsemi: xtensa: fix section mismatch warnings +- i2c: cbus-gpio: set atomic transfer callback +- i2c: stm32f7: stop dma transfer in case of NACK +- i2c: stm32f7: recover the bus on access timeout +- i2c: stm32f7: flush TX FIFO upon transfer errors +- wireguard: ratelimiter: use kvcalloc() instead of kvzalloc() +- wireguard: receive: drop handshakes if queue lock is contended +- wireguard: receive: use ring buffer for incoming handshakes +- wireguard: device: reset peer src endpoint when netns exits +- wireguard: selftests: rename DEBUG_PI_LIST to DEBUG_PLIST +- wireguard: selftests: actually test for routing loops +- wireguard: allowedips: add missing __rcu annotation to satisfy sparse +- wireguard: selftests: increase default dmesg log size +- tracing/histograms: String compares should not care about signed values +- KVM: X86: Use vcpu->arch.walk_mmu for kvm_mmu_invlpg() +- KVM: arm64: Avoid setting the upper 32 bits of TCR_EL2 and CPTR_EL2 to 1 +- KVM: x86: Use a stable condition around all VT-d PI paths +- KVM: nVMX: Flush current VPID (L1 vs. L2) for KVM_REQ_TLB_FLUSH_GUEST +- KVM: Disallow user memslot with size that exceeds "unsigned long" +- drm/amd/display: Allow DSC on supported MST branch devices +- ipv6: fix memory leak in fib6_rule_suppress +- sata_fsl: fix warning in remove_proc_entry when rmmod sata_fsl +- sata_fsl: fix UAF in sata_fsl_port_stop when rmmod sata_fsl +- s390/pci: move pseudo-MMIO to prevent MIO overlap +- ipmi: Move remove_work to dedicated workqueue +- rt2x00: do not mark device gone on EPROTO errors during start +- kprobes: Limit max data_size of the kretprobe instances +- vrf: Reset IPCB/IP6CB when processing outbound pkts in vrf dev xmit +- ACPI: Add stubs for wakeup handler functions +- net/smc: Avoid warning of possible recursive locking +- perf report: Fix memory leaks around perf_tip() +- perf hist: Fix memory leak of a perf_hpp_fmt +- net: ethernet: dec: tulip: de4x5: fix possible array overflows in type3_infoblock() +- net: tulip: de4x5: fix the problem that the array 'lp->phy[8]' may be out of bound +- ipv6: check return value of ipv6_skip_exthdr +- ethernet: hisilicon: hns: hns_dsaf_misc: fix a possible array overflow in hns_dsaf_ge_srst_by_port() +- ata: ahci: Add Green Sardine vendor ID as board_ahci_mobile +- drm/amd/amdgpu: fix potential memleak +- drm/amd/amdkfd: Fix kernel panic when reset failed and been triggered again +- scsi: iscsi: Unblock session then wake up error handler +- thermal: core: Reset previous low and high trip during thermal zone init +- btrfs: check-integrity: fix a warning on write caching disabled disk +- s390/setup: avoid using memblock_enforce_memory_limit +- platform/x86: thinkpad_acpi: Fix WWAN device disabled issue after S3 deep +- platform/x86: thinkpad_acpi: Add support for dual fan control +- net: return correct error code +- net/smc: Transfer remaining wait queue entries during fallback +- mac80211: do not access the IV when it was stripped +- drm/sun4i: fix unmet dependency on RESET_CONTROLLER for PHY_SUN6I_MIPI_DPHY +- powerpc/pseries/ddw: Revert "Extend upper limit for huge DMA window for persistent memory" +- gfs2: Fix length of holes reported at end-of-file +- gfs2: release iopen glock early in evict +- ovl: fix deadlock in splice write +- ovl: simplify file splice +- can: j1939: j1939_tp_cmd_recv(): check the dst address of TP.CM_BAM +- NFSv42: Fix pagecache invalidation after COPY/CLONE +- drm/amdgpu/gfx9: switch to golden tsc registers for renoir+ +- net: stmmac: platform: fix build warning when with !CONFIG_PM_SLEEP +- shm: extend forced shm destroy to support objects from several IPC nses +- s390/mm: validate VMA in PGSTE manipulation functions +- tty: hvc: replace BUG_ON() with negative return value +- xen/netfront: don't trust the backend response data blindly +- xen/netfront: disentangle tx_skb_freelist +- xen/netfront: don't read data from request on the ring page +- xen/netfront: read response from backend only once +- xen/blkfront: don't trust the backend response data blindly +- xen/blkfront: don't take local copy of a request from the ring page +- xen/blkfront: read response from backend only once +- xen: sync include/xen/interface/io/ring.h with Xen's newest version +- tracing: Check pid filtering when creating events +- vhost/vsock: fix incorrect used length reported to the guest +- iommu/amd: Clarify AMD IOMMUv2 initialization messages +- smb3: do not error on fsync when readonly +- ceph: properly handle statfs on multifs setups +- f2fs: set SBI_NEED_FSCK flag when inconsistent node block found +- sched/scs: Reset task stack state in bringup_cpu() +- tcp: correctly handle increased zerocopy args struct size +- net: mscc: ocelot: correctly report the timestamping RX filters in ethtool +- net: mscc: ocelot: don't downgrade timestamping RX filters in SIOCSHWTSTAMP +- net/smc: Don't call clcsock shutdown twice when smc shutdown +- net: vlan: fix underflow for the real_dev refcnt +- net/sched: sch_ets: don't peek at classes beyond 'nbands' +- tls: fix replacing proto_ops +- tls: splice_read: fix record type check +- MIPS: use 3-level pgtable for 64KB page size on MIPS_VA_BITS_48 +- MIPS: loongson64: fix FTLB configuration +- igb: fix netpoll exit with traffic +- nvmet: use IOCB_NOWAIT only if the filesystem supports it +- net/smc: Fix loop in smc_listen +- net/smc: Fix NULL pointer dereferencing in smc_vlan_by_tcpsk() +- net: phylink: Force retrigger in case of latched link-fail indicator +- net: phylink: Force link down and retrigger resolve on interface change +- lan743x: fix deadlock in lan743x_phy_link_status_change() +- tcp_cubic: fix spurious Hystart ACK train detections for not-cwnd-limited flows +- drm/amd/display: Set plane update flags for all planes in reset +- PM: hibernate: use correct mode for swsusp_close() +- net/ncsi : Add payload to be 32-bit aligned to fix dropped packets +- nvmet-tcp: fix incomplete data digest send +- net: marvell: mvpp2: increase MTU limit when XDP enabled +- mlxsw: spectrum: Protect driver from buggy firmware +- mlxsw: Verify the accessed index doesn't exceed the array length +- net/smc: Ensure the active closing peer first closes clcsock +- erofs: fix deadlock when shrink erofs slab +- scsi: scsi_debug: Zero clear zones at reset write pointer +- scsi: core: sysfs: Fix setting device state to SDEV_RUNNING +- ice: avoid bpf_prog refcount underflow +- ice: fix vsi->txq_map sizing +- net: nexthop: release IPv6 per-cpu dsts when replacing a nexthop group +- net: ipv6: add fib6_nh_release_dsts stub +- net: stmmac: retain PTP clock time during SIOCSHWTSTAMP ioctls +- net: stmmac: fix system hang caused by eee_ctrl_timer during suspend/resume +- nfp: checking parameter process for rx-usecs/tx-usecs is invalid +- ipv6: fix typos in __ip6_finish_output() +- firmware: smccc: Fix check for ARCH_SOC_ID not implemented +- mptcp: fix delack timer +- ALSA: intel-dsp-config: add quirk for JSL devices based on ES8336 codec +- iavf: Prevent changing static ITR values if adaptive moderation is on +- net: marvell: prestera: fix double free issue on err path +- drm/vc4: fix error code in vc4_create_object() +- scsi: mpt3sas: Fix kernel panic during drive powercycle test +- drm/nouveau/acr: fix a couple NULL vs IS_ERR() checks +- ARM: socfpga: Fix crash with CONFIG_FORTIRY_SOURCE +- NFSv42: Don't fail clone() unless the OP_CLONE operation failed +- firmware: arm_scmi: pm: Propagate return value to caller +- net: ieee802154: handle iftypes as u32 +- ASoC: codecs: wcd934x: return error code correctly from hw_params +- ASoC: topology: Add missing rwsem around snd_ctl_remove() calls +- ASoC: qdsp6: q6asm: fix q6asm_dai_prepare error handling +- ASoC: qdsp6: q6routing: Conditionally reset FrontEnd Mixer +- ARM: dts: bcm2711: Fix PCIe interrupts +- ARM: dts: BCM5301X: Add interrupt properties to GPIO node +- ARM: dts: BCM5301X: Fix I2C controller interrupt +- netfilter: flowtable: fix IPv6 tunnel addr match +- netfilter: ipvs: Fix reuse connection if RS weight is 0 +- netfilter: ctnetlink: do not erase error code with EINVAL +- netfilter: ctnetlink: fix filtering with CTA_TUPLE_REPLY +- proc/vmcore: fix clearing user buffer by properly using clear_user() +- PCI: aardvark: Fix link training +- PCI: aardvark: Simplify initialization of rootcap on virtual bridge +- PCI: aardvark: Implement re-issuing config requests on CRS response +- PCI: aardvark: Update comment about disabling link training +- PCI: aardvark: Deduplicate code in advk_pcie_rd_conf() +- powerpc/32: Fix hardlockup on vmap stack overflow +- mdio: aspeed: Fix "Link is Down" issue +- mmc: sdhci: Fix ADMA for PAGE_SIZE >= 64KiB +- mmc: sdhci-esdhc-imx: disable CMDQ support +- tracing: Fix pid filtering when triggers are attached +- tracing/uprobe: Fix uprobe_perf_open probes iteration +- KVM: PPC: Book3S HV: Prevent POWER7/8 TLB flush flushing SLB +- xen: detect uninitialized xenbus in xenbus_init +- xen: don't continue xenstore initialization in case of errors +- fuse: release pipe buf after last use +- staging: rtl8192e: Fix use after free in _rtl92e_pci_disconnect() +- staging: greybus: Add missing rwsem around snd_ctl_remove() calls +- staging/fbtft: Fix backlight +- HID: wacom: Use "Confidence" flag to prevent reporting invalid contacts +- Revert "parisc: Fix backtrace to always include init funtion names" +- media: cec: copy sequence field for the reply +- ALSA: hda/realtek: Fix LED on HP ProBook 435 G7 +- ALSA: hda/realtek: Add quirk for ASRock NUC Box 1100 +- ALSA: ctxfi: Fix out-of-range access +- binder: fix test regression due to sender_euid change +- usb: hub: Fix locking issues with address0_mutex +- usb: hub: Fix usb enumeration issue due to address0 race +- usb: typec: fusb302: Fix masking of comparator and bc_lvl interrupts +- usb: chipidea: ci_hdrc_imx: fix potential error pointer dereference in probe +- net: nexthop: fix null pointer dereference when IPv6 is not enabled +- usb: dwc3: gadget: Fix null pointer exception +- usb: dwc3: gadget: Check for L1/L2/U3 for Start Transfer +- usb: dwc3: gadget: Ignore NoStream after End Transfer +- usb: dwc2: hcd_queue: Fix use of floating point literal +- usb: dwc2: gadget: Fix ISOC flow for elapsed frames +- USB: serial: option: add Fibocom FM101-GL variants +- USB: serial: option: add Telit LE910S1 0x9200 composition +- ACPI: Get acpi_device's parent from the parent field +- ARM: Add unwinding annotations to __loop.*delay functions +- fcntl: fix potential deadlocks for &fown_struct.lock +- mm: usercopy: Warn vmalloc/module address in check_heap_object() +- powerpc: Fix virt_addr_valid() check +- jffs2: fix memory leak in jffs2_scan_medium +- jffs2: fix memory leak in jffs2_do_mount_fs +- jffs2: fix use-after-free in jffs2_clear_xattr_subsystem +- powerpc/85xx: Fix oops when CONFIG_FSL_PMC=n +- netdevsim: Zero-initialize memory for new map's value in function nsim_bpf_map_alloc +- mm/hwpoison: clear MF_COUNT_INCREASED before retrying get_any_page() +- hugetlb: address ref count racing in prep_compound_gigantic_page +- memblock: ensure there is no overflow in memblock_overlaps_region() +- phonet: refcount leak in pep_sock_accep +- Revert "[Backport] ARM: BCM53016: Specify switch ports for Meraki MR32" +- USB: gadget: bRequestType is a bitfield, not a enum +- USB: gadget: detect too-big endpoint 0 requests +- Revert "perf: Rework perf_event_exit_event()" +- ALSA: hda: hdac_stream: fix potential locking issue in snd_hdac_stream_assign() +- ALSA: hda: hdac_ext_stream: fix potential locking issues +- x86/Kconfig: Fix an unused variable error in dell-smm-hwmon +- btrfs: update device path inode time instead of bd_inode +- fs: export an inode_update_time helper +- ice: Delete always true check of PF pointer +- usb: max-3421: Use driver data instead of maintaining a list of bound devices +- ASoC: DAPM: Cover regression by kctl change notification fix +- selinux: fix NULL-pointer dereference when hashtab allocation fails +- RDMA/netlink: Add __maybe_unused to static inline in C file +- scsi: ufs: core: Fix task management completion timeout race +- scsi: ufs: core: Fix task management completion +- drm/amdgpu: fix set scaling mode Full/Full aspect/Center not works on vga and dvi connectors +- drm/i915/dp: Ensure sink rate values are always valid +- drm/udl: fix control-message timeout +- drm/amd/display: Update swizzle mode enums +- cfg80211: call cfg80211_stop_ap when switch from P2P_GO type +- parisc/sticon: fix reverse colors +- btrfs: fix memory ordering between normal and ordered work functions +- net: stmmac: socfpga: add runtime suspend/resume callback for stratix10 platform +- udf: Fix crash after seekdir +- KVM: nVMX: don't use vcpu->arch.efer when checking host state on nested state load +- block: Check ADMIN before NICE for IOPRIO_CLASS_RT +- s390/kexec: fix memory leak of ipl report buffer +- scsi: qla2xxx: Fix mailbox direction flags in qla2xxx_get_adapter_id() +- powerpc/8xx: Fix pinned TLBs with CONFIG_STRICT_KERNEL_RWX +- x86/hyperv: Fix NULL deref in set_hv_tscchange_cb() if Hyper-V setup fails +- mm: kmemleak: slob: respect SLAB_NOLEAKTRACE flag +- ipc: WARN if trying to remove ipc object which is absent +- tipc: check for null after calling kmemdup +- hexagon: clean up timer-regs.h +- hexagon: export raw I/O routines for modules +- tun: fix bonding active backup with arp monitoring +- arm64: vdso32: suppress error message for 'make mrproper' +- net: stmmac: dwmac-rk: Fix ethernet on rk3399 based devices +- s390/kexec: fix return code handling +- perf/x86/intel/uncore: Fix IIO event constraints for Skylake Server +- perf/x86/intel/uncore: Fix filter_tid mask for CHA events on Skylake Server +- pinctrl: qcom: sdm845: Enable dual edge errata +- KVM: PPC: Book3S HV: Use GLOBAL_TOC for kvmppc_h_set_dabr/xdabr() +- e100: fix device suspend/resume +- NFC: add NCI_UNREG flag to eliminate the race +- net: nfc: nci: Change the NCI close sequence +- NFC: reorder the logic in nfc_{un,}register_device +- NFC: reorganize the functions in nci_request +- i40e: Fix display error code in dmesg +- i40e: Fix creation of first queue by omitting it if is not power of two +- i40e: Fix warning message and call stack during rmmod i40e driver +- i40e: Fix ping is lost after configuring ADq on VF +- i40e: Fix changing previously set num_queue_pairs for PFs +- i40e: Fix NULL ptr dereference on VSI filter sync +- i40e: Fix correct max_pkt_size on VF RX queue +- net: virtio_net_hdr_to_skb: count transport header in UFO +- net: dpaa2-eth: fix use-after-free in dpaa2_eth_remove +- net: sched: act_mirred: drop dst for the direction from egress to ingress +- scsi: core: sysfs: Fix hang when device state is set via sysfs +- net/mlx5: E-Switch, return error if encap isn't supported +- net/mlx5: E-Switch, Change mode lock from mutex to rw semaphore +- net/mlx5: Lag, update tracker when state change event received +- net/mlx5e: nullify cq->dbg pointer in mlx5_debug_cq_remove() +- platform/x86: hp_accel: Fix an error handling path in 'lis3lv02d_probe()' +- mips: lantiq: add support for clk_get_parent() +- mips: bcm63xx: add support for clk_get_parent() +- MIPS: generic/yamon-dt: fix uninitialized variable error +- iavf: Fix for setting queues to 0 +- iavf: Fix for the false positive ASQ/ARQ errors while issuing VF reset +- iavf: validate pointers +- iavf: prevent accidental free of filter structure +- iavf: Fix failure to exit out from last all-multicast mode +- iavf: free q_vectors before queues in iavf_disable_vf +- iavf: check for null in iavf_fix_features +- iavf: Fix return of set the new channel count +- net/smc: Make sure the link_id is unique +- sock: fix /proc/net/sockstat underflow in sk_clone_lock() +- net: reduce indentation level in sk_clone_lock() +- tipc: only accept encrypted MSG_CRYPTO msgs +- bnxt_en: reject indirect blk offload when hw-tc-offload is off +- net: bnx2x: fix variable dereferenced before check +- net: ipa: disable HOLB drop when updating timer +- tracing: Add length protection to histogram string copies +- tcp: Fix uninitialized access in skb frags array for Rx 0cp. +- net-zerocopy: Refactor skb frag fast-forward op. +- net-zerocopy: Copy straggler unaligned data for TCP Rx. zerocopy. +- drm/nouveau: hdmigv100.c: fix corrupted HDMI Vendor InfoFrame +- perf tests: Remove bash construct from record+zstd_comp_decomp.sh +- perf bench futex: Fix memory leak of perf_cpu_map__new() +- perf bpf: Avoid memory leak from perf_env__insert_btf() +- tracing/histogram: Do not copy the fixed-size char array field over the field size +- perf/x86/vlbr: Add c->flags to vlbr event constraints +- sched/core: Mitigate race cpus_share_cache()/update_top_cache_domain() +- mips: BCM63XX: ensure that CPU_SUPPORTS_32BIT_KERNEL is set +- clk: qcom: gcc-msm8996: Drop (again) gcc_aggre1_pnoc_ahb_clk +- clk/ast2600: Fix soc revision for AHB +- clk: ingenic: Fix bugs with divided dividers +- f2fs: fix incorrect return value in f2fs_sanity_check_ckpt() +- f2fs: compress: disallow disabling compress on non-empty compressed file +- sh: define __BIG_ENDIAN for math-emu +- sh: math-emu: drop unused functions +- sh: fix kconfig unmet dependency warning for FRAME_POINTER +- f2fs: fix to use WHINT_MODE +- f2fs: fix up f2fs_lookup tracepoints +- maple: fix wrong return value of maple_bus_init(). +- sh: check return code of request_irq +- powerpc/8xx: Fix Oops with STRICT_KERNEL_RWX without DEBUG_RODATA_TEST +- powerpc/dcr: Use cmplwi instead of 3-argument cmpli +- ALSA: gus: fix null pointer dereference on pointer block +- ARM: dts: qcom: fix memory and mdio nodes naming for RB3011 +- powerpc/5200: dts: fix memory node unit name +- iio: imu: st_lsm6dsx: Avoid potential array overflow in st_lsm6dsx_set_odr() +- scsi: target: Fix alua_tg_pt_gps_count tracking +- scsi: target: Fix ordered tag handling +- MIPS: sni: Fix the build +- tty: tty_buffer: Fix the softlockup issue in flush_to_ldisc +- ALSA: ISA: not for M68K +- ARM: dts: ls1021a-tsn: use generic "jedec,spi-nor" compatible for flash +- ARM: dts: ls1021a: move thermal-zones node out of soc/ +- usb: host: ohci-tmio: check return value after calling platform_get_resource() +- ARM: dts: omap: fix gpmc,mux-add-data type +- firmware_loader: fix pre-allocated buf built-in firmware use +- ALSA: intel-dsp-config: add quirk for APL/GLK/TGL devices based on ES8336 codec +- scsi: advansys: Fix kernel pointer leak +- ASoC: nau8824: Add DMI quirk mechanism for active-high jack-detect +- clk: imx: imx6ul: Move csi_sel mux to correct base register +- ASoC: SOF: Intel: hda-dai: fix potential locking issue +- arm64: dts: freescale: fix arm,sp805 compatible string +- arm64: dts: qcom: ipq6018: Fix qcom,controlled-remotely property +- arm64: dts: qcom: msm8998: Fix CPU/L2 idle state latency and residency +- ARM: BCM53016: Specify switch ports for Meraki MR32 +- staging: rtl8723bs: remove possible deadlock when disconnect (v2) +- ARM: dts: ux500: Skomer regulator fixes +- usb: typec: tipd: Remove WARN_ON in tps6598x_block_read +- usb: musb: tusb6010: check return value after calling platform_get_resource() +- bus: ti-sysc: Use context lost quirk for otg +- bus: ti-sysc: Add quirk handling for reinit on context lost +- RDMA/bnxt_re: Check if the vlan is valid before reporting +- arm64: dts: hisilicon: fix arm,sp805 compatible string +- arm64: dts: rockchip: Disable CDN DP on Pinebook Pro +- scsi: lpfc: Fix list_add() corruption in lpfc_drain_txq() +- ARM: dts: NSP: Fix mpcore, mmc node names +- staging: wfx: ensure IRQ is ready before enabling it +- arm64: dts: allwinner: a100: Fix thermal zone node name +- arm64: dts: allwinner: h5: Fix GPU thermal zone node name +- ARM: dts: sunxi: Fix OPPs node name +- arm64: zynqmp: Fix serial compatible string +- arm64: zynqmp: Do not duplicate flash partition label property +- ubifs: ubifs_releasepage: Remove ubifs_assert(0) to valid this process +- ubifs: ubifs_writepage: Mark page dirty after writing inode failed +- fget: check that the fd still exists after getting a ref to it +- nbd: Fix use-after-free in blk_mq_free_rqs +- xfs: fix up non-directory creation in SGID directories +- pipe: Fix endless sleep problem due to the out-of-order +- blk-cgroup: prevent rcu_sched detected stalls warnings while iterating blkgs +- blk-throttle: don't check whether or not lower limit is valid if CONFIG_BLK_DEV_THROTTLING_LOW is off +- block: Fix fsync always failed if once failed +- kfence: fix memory leak when cat kfence objects +- io_uring: fix soft lockup when call __io_remove_buffers +- io_uring: return back safer resurrect +- io_uring: fix ltout double free on completion race +- ext4: always panic when errors=panic is specified +- scsi: core: Stop using DRIVER_ERROR +- drm/i915/guc: Update to use firmware v49.0.1 + +* Wed Jan 12 2022 Zheng Zengkai - 5.10.0-39.0.0.21 +- Increase-debugfs_dump_index-after-dump +- brd: expose number of allocated pages in debugfs +- net: hns3: create new common cmd code for PF and VF modules +- net: hns3: refactor VF tqp stats APIs with new common tqp stats APIs +- net: hns3: refactor PF tqp stats APIs with new common tqp stats APIs +- net: hns3: create new set of common tqp stats APIs for PF and VF reuse +- net: hns3: refactor VF rss init APIs with new common rss init APIs +- net: hns3: refactor PF rss init APIs with new common rss init APIs +- net: hns3: create new set of common rss init APIs for PF and VF reuse +- net: hns3: refactor VF rss set APIs with new common rss set APIs +- net: hns3: refactor PF rss set APIs with new common rss set APIs +- net: hns3: create new set of common rss set APIs for PF and VF module +- net: hns3: refactor VF rss get APIs with new common rss get APIs +- net: hns3: refactor PF rss get APIs with new common rss get APIs +- net: hns3: create new set of common rss get APIs for PF and VF rss module +- net: hns3: refactor hclge_comm_send function in PF/VF drivers +- net: hns3: create new rss common structure hclge_comm_rss_cfg +- net: hns3: delete the hclge_cmd.c and hclgevf_cmd.c +- net: hns3: refactor VF cmdq init and uninit APIs with new common APIs +- net: hns3: refactor PF cmdq init and uninit APIs with new common APIs +- net: hns3: create common cmdq init and uninit APIs +- net: hns3: refactor VF cmdq resource APIs with new common APIs +- net: hns3: refactor PF cmdq resource APIs with new common APIs +- net: hns3: create common cmdq resource allocate/free/query APIs +- net: hns3: refactor hclgevf_cmd_send with new hclge_comm_cmd_send API +- net: hns3: refactor hclge_cmd_send with new hclge_comm_cmd_send API +- net: hns3: create new set of unified hclge_comm_cmd_send APIs +- net: hns3: use struct hclge_desc to replace hclgevf_desc in VF cmdq module +- net: hns3: create new cmdq hardware description structure hclge_comm_hw +- net: hns3: refactor hns3 makefile to support hns3_common module +- Revert "bcache: add a framework to perform prefetch" +- Revert "bcache: provide a switch to bypass all IO requests" +- Revert "bcache: inflight prefetch requests block overlapped normal requests" +- Revert "bcache: Delay to invalidate cache data in writearound write" +- Revert "bcache: Add a sample of userspace prefetch client" +- Revert "bcache: Rewrite patch to delay to invalidate cache data" +- Revert "bcache: do not collect data insert info created by write_moving" +- Revert "bcache: always record start time of a sample" + +* Mon Jan 10 2022 Zheng Zengkai - 5.10.0-38.0.0.20 +- netfilter: fix regression in looped (broad|multi)cast's MAC handling +- ACPI: CPPC: Fix cppc_cpufreq_init failed in CPU Hotplug situation +- cpufreq: Fix get_cpu_device() failure in add_cpu_dev_symlink() +- serial: amba-pl011: Fix serial port discard interrupt when interrupt signal line of serial port is connected to mbigen. +- dt-bindings: mpam: add document for arm64 mpam +- arm64/mpam: add device tree support for mpam initialization +- arm64/mpam: remove __init macro to support driver probe +- perf script: Fix printing 'phys_addr' failure issue +- bcache: always record start time of a sample +- bcache: do not collect data insert info created by write_moving +- bcache: Rewrite patch to delay to invalidate cache data +- bcache: Add a sample of userspace prefetch client +- bcache: Delay to invalidate cache data in writearound write +- bcache: inflight prefetch requests block overlapped normal requests +- bcache: provide a switch to bypass all IO requests +- bcache: add a framework to perform prefetch +- tcp: Add some stub info for KABI consistency +- BMA: Fix format string compile warning in arm32 builds + +* Sat Jan 08 2022 Zheng Zengkai - 5.10.0-36.0.0.19 +- hugepage: add sysctl for hugepage alloc and mig +- mm: export node type {pmem|dram} under /sys/bus/node +- acpi/numa: memorize node type from SRAT table +- etmem_scan: add pte_hole callback +- etmem_scan: release CPU after scan walk_step size +- etmem: fix potential UAF when walk ept page table +- etmem: fix concurrent access to export file operations +- etmem scan: fix memleak in vm_idle_read +- etmem_scan: x86: support scan 4 level ept under 5 level host page table +- etmem: x86: support scan hugetlb of vm +- etmem: add ioctl for mm idle scan +- RDMA/hns: Remove support for HIP06 +- RDMA/hns: Remove RST2RST error prints for hw v1 +- RDMA/hns: Support direct wqe of userspace +- RDMA/hns: Modify the mapping attribute of doorbell to device +- RDMA/hns: Encapsulate the qp db as a function +- RDMA/hns: Use the core code to manage the fixed mmap entries +- RDMA/hns: Use IDA interface to manage uar index +- RDMA/hns: Enable the cmd mask of uverbs to create and destroy AH +- RDMA/hns: Fix Direct WQE is not enable +- RDMA/hns: Enable stash feature of HIP09 + +* Fri Jan 07 2022 Zheng Zengkai - 5.10.0-35.0.0.18 +- tcp_comp: add stub proto ops for tcp compression socket +- tcp_comp: allow ignore local tcp connections +- tcp_comp: only enable compression for give server ports +- tcp_comp: add sysctl for enable/disable compression +- tcp_comp: add init and cleanup hook for compression +- tcp_comp: add tcp comp option to SYN and SYN-ACK +- tcp_comp: add Kconfig for tcp payload compression +- xfs: move the CIL workqueue to the CIL +- xfs: CIL work is serialised, not pipelined +- xfs: AIL needs asynchronous CIL forcing +- xfs: reduce ilock acquisitions in xfs_file_fsync +- xfs: refactor xfs_file_fsync +- xfs: throttle inode inactivation queuing on memory reclaim +- xfs: avoid buffer deadlocks when walking fs inodes +- xfs: use background worker pool when transactions can't get free space +- xfs: don't run speculative preallocation gc when fs is frozen +- xfs: flush inode inactivation work when compiling usage statistics +- xfs: inactivate inodes any time we try to free speculative preallocations +- xfs: queue inactivation immediately when free realtime extents are tight +- xfs: queue inactivation immediately when quota is nearing enforcement +- xfs: queue inactivation immediately when free space is tight +- xfs: per-cpu deferred inode inactivation queues +- xfs: detach dquots from inode if we don't need to inactivate it +- xfs: move xfs_inactive call to xfs_inode_mark_reclaimable +- xfs: remove the active vs running quota differentiation +- xfs: remove the flags argument to xfs_qm_dquot_walk +- xfs: remove xfs_dqrele_all_inodes +- xfs: remove support for disabling quota accounting on a mounted file system +- xfs: don't nest transactions when scanning for eofblocks +- xfs: force log and push AIL to clear pinned inodes when aborting mount +- xfs: separate primary inode selection criteria in xfs_iget_cache_hit +- xfs: refactor the inode recycling code +- xfs: add iclog state trace events +- xfs: rename struct xfs_eofblocks to xfs_icwalk +- xfs: change the prefix of XFS_EOF_FLAGS_* to XFS_ICWALK_FLAG_ +- xfs: selectively keep sick inodes in memory +- xfs: drop IDONTCACHE on inodes when we mark them sick +- xfs: refactor per-AG inode tagging functions +- xfs: merge xfs_reclaim_inodes_ag into xfs_inode_walk_ag +- xfs: pass struct xfs_eofblocks to the inode scan callback +- xfs: fix radix tree tag signs +- xfs: make the icwalk processing functions clean up the grab state +- xfs: clean up inode state flag tests in xfs_blockgc_igrab +- xfs: remove indirect calls from xfs_inode_walk{,_ag} +- xfs: remove iter_flags parameter from xfs_inode_walk_* +- xfs: move xfs_inew_wait call into xfs_dqrele_inode +- xfs: separate the dqrele_all inode grab logic from xfs_inode_walk_ag_grab +- xfs: pass the goal of the incore inode walk to xfs_inode_walk() +- xfs: rename xfs_inode_walk functions to xfs_icwalk +- xfs: move the inode walk functions further down +- xfs: detach inode dquots at the end of inactivation +- xfs: move the quotaoff dqrele inode walk into xfs_icache.c +- xfs: don't bounce the iolock between free_{eof,cow}blocks +- xfs: expose the blockgc workqueue knobs publicly +- xfs: rename the blockgc workqueue +- xfs: prevent metadata files from being inactivated +- xfs: parallelize block preallocation garbage collection +- xfs: rename block gc start and stop functions +- xfs: only walk the incore inode tree once per blockgc scan +- xfs: consolidate the eofblocks and cowblocks workers +- xfs: consolidate incore inode radix tree posteof/cowblocks tags +- xfs: remove trivial eof/cowblocks functions +- xfs: hide xfs_icache_free_cowblocks +- xfs: hide xfs_icache_free_eofblocks +- xfs: relocate the eofb/cowb workqueue functions +- xfs: set WQ_SYSFS on all workqueues in debug mode +- xfs: increase the default parallelism levels of pwork clients +- xfs: flush speculative space allocations when we run out of space +- xfs: refactor xfs_icache_free_{eof,cow}blocks call sites +- xfs: add a tracepoint for blockgc scans +- xfs: flush eof/cowblocks if we can't reserve quota for chown +- xfs: flush eof/cowblocks if we can't reserve quota for inode creation +- xfs: flush eof/cowblocks if we can't reserve quota for file blocks +- xfs: try worst case space reservation upfront in xfs_reflink_remap_extent +- xfs: pass flags and return gc errors from xfs_blockgc_free_quota +- xfs: move and rename xfs_inode_free_quota_blocks to avoid conflicts +- xfs: xfs_inode_free_quota_blocks should scan project quota +- xfs: don't stall cowblocks scan if we can't take locks +- xfs: trigger all block gc scans when low on quota space +- xfs: shut down the filesystem if we screw up quota reservation +- xfs: rename code to error in xfs_ioctl_setattr +- xfs: remove xfs_qm_vop_chown_reserve +- xfs: refactor inode ownership change transaction/inode/quota allocation idiom +- xfs: refactor inode creation transaction/inode/quota allocation idiom +- xfs: refactor reflink functions to use xfs_trans_alloc_inode +- xfs: allow reservation of rtblocks with xfs_trans_alloc_inode +- xfs: refactor common transaction/inode/quota allocation idiom +- xfs: reserve data and rt quota at the same time +- xfs: fix up build warnings when quotas are disabled +- xfs: clean up icreate quota reservation calls +- xfs: remove xfs_trans_unreserve_quota_nblks completely +- xfs: create convenience wrappers for incore quota block reservations +- xfs: clean up quota reservation callsites +- xfs: reduce quota reservation when doing a dax unwritten extent conversion +- scsi:spraid: use bsg module to replace with ioctrl +- KVM: vmx/pmu: Fix dummy check if lbr_desc->event is created +- KVM: vmx/pmu: Expose LBR_FMT in the MSR_IA32_PERF_CAPABILITIES +- KVM: vmx/pmu: Release guest LBR event via lazy release mechanism +- KVM: vmx/pmu: Emulate legacy freezing LBRs on virtual PMI +- KVM: vmx/pmu: Reduce the overhead of LBR pass-through or cancellation +- KVM: vmx/pmu: Pass-through LBR msrs when the guest LBR event is ACTIVE +- KVM: vmx/pmu: Create a guest LBR event when vcpu sets DEBUGCTLMSR_LBR +- KVM: vmx/pmu: Add PMU_CAP_LBR_FMT check when guest LBR is enabled +- KVM: vmx/pmu: Add PMU_CAP_LBR_FMT check when guest LBR is enabled +- KVM: x86/pmu: preserve IA32_PERF_CAPABILITIES across CPUID refresh +- KVM: x86/vmx: Make vmx_set_intercept_for_msr() non-static +- KVM: VMX: read/write MSR_IA32_DEBUGCTLMSR from GUEST_IA32_DEBUGCTL +- openeuler_defconfig: Enable sharepool feature in defconfig +- net/spnic:The reset command flags modification. +- net/spnic:Attribute negotiation and optimization. +- net/spnic:RSS initialization process optimization +- arm64: Fix conflict for capability when cpu hotplug +- memcg: Add static key for memcg kswapd +- memcg: make memcg kswapd deal with dirty +- memcg: support memcg sync reclaim work as kswapd +- memcg: Export memcg.high from cgroupv2 to cgroupv1 +- memcg: Export memcg.{min/low} from cgroupv2 to cgroupv1 +- kabi: Add reserved page and gfp flags for future extension +- kabi: reserve space for cgroup_bpf_attach_type and bpf_cgroup_storage_type +- bpf: Migrate cgroup_bpf to internal cgroup_bpf_attach_type enum +- bpf: Split cgroup_bpf_enabled per attach type +- bpf: Try to avoid kzalloc in cgroup/{s,g}etsockopt +- bpf: Allow bpf_{s,g}etsockopt from cgroup bind{4,6} hooks +- KABI: Add KABI_AUX_PTR extenstions to some more base structures +- kabi: Generalize naming of kabi helper macros +- arm64: Request resources for reserved memory via memmap +- arm64: Add support for memmap kernel parameters + +* Fri Jan 07 2022 Zheng Zengkai - 5.10.0-34.0.0.17 +- openeuler_defconfig: Enable CONFIG_KABI_RESERVE for x86 and arm64 +- KABI: Add CONFIG_KABI_RESERVE to control KABI padding reserve +- KABI: Fix allmodconfig build error +- Revert "kabi: reserve space for ptp_clock.h" +- kabi: reserve space for arm64 cpufeature related structure +- UAPI: nfsfh.h: Replace one-element array with flexible-array member +- kabi: Add kabi reservation for storage module +- KABI:reserve space for sched structures +- KABI: reserve space for IMA IPE +- kabi: reserve space for cred and user_namespace +- Increase size of ucounts to atomic_long_t +- kabi: reserve space for fwnode.h +- kabi: reserve space for iommu.h +- kabi: reserve space for ptp_clock.h +- kabi: reserve space for struct ptp_clock_info +- kabi: reserve space for struct ptp_clock +- kabi: reserve space for struct module +- kabi: reserve space for kobject related structures +- kabi: reserve space for io subsystem related structures +- KABI: add KABI padding to x86/paravirt ops structures +- KABI: add KABI padding to cpuidle structures +- kabi: reserve space for struct dma_map_ops +- kabi: reserve space for struct cpu_stop_work +- kabi: reserve space for perf subsystem related structures +- kabi: net: reserve space for net netfilter subsystem related structure +- kabi: net: reserve space for net bpf subsystem related structure +- kabi: net: reserve space for net rdma subsystem related structure +- kabi: net: reserve space for net sunrpc subsystem related structure +- kabi: net: reserve space for net can subsystem related structure +- kabi: net: reserve space for net base subsystem related structure +- kabi: reserve space for cgroup bpf structures +- kabi: reserve space for cpu cgroup and cpuset cgroup related structures +- kabi: reserve space for memcg related structures +- kabi: reserve space for cgroup framework related structures +- kabi: mm: reserve space for memory subsystem related +- msi: Add kabi_reserve in msi.h +- irqdomain: Add kabi_reserve in irqdomain +- irq_desc: Add kabi_reserve in irq_desc +- irq: Add kabi_reserve in irq +- interrupt: Add kabi_reserve in interrupt.h +- bootparam: Add kabi_reserve in bootparam +- kabi: reserve space for hrtimer related structures +- kabi: reserve space for time and workqueue subsystem related structure +- kabi: reserve space for struct worker +- kabi: reserve space for net_namespace +- kabi: reserve space for power management related structure +- kabi: reserve space for pci subsystem related structure +- kabi: reserve space for posix clock related structure +- kabi: add kABI reference checking tool +- kabi: add a tool to generate the kabi reference relationship +- kabi: add script tools to check kabi symbol +- kabi: enables more stringent kabi checks +- kabi: add KABI_SIZE_ALIGN_CHECKS for more stringent kabi checks +- kabi: add kabi helper macros +- pci: do not save 'PCI_BRIDGE_CTL_BUS_RESET' +- PCI: check BIR before mapping MSI-X Table +- PCI: Fail MSI-X mapping if MSI-X Table offset is out of range of BAR space +- PCI/sysfs: Take reference on device to be removed +- pciehp: fix a race between pciehp and removing operations by sysfs +- iommu/arm-smmu-v3: Add suspend and resume support +- cgroup: Fix task_css_check rcu warnings +- psi: using cpuacct_cgrp_id under CONFIG_CGROUP_CPUACCT +- psi: fix unexpected behavior of psi in cgroup v1 during init +- perf inject: Fix ARM SPE handling +- perf tools: Set COMPAT_NEED_REALLOCARRAY for CONFIG_AUXTRACE=1 +- perf arm-spe: Support hardware-based PID tracing +- perf arm-spe: Save context ID in record +- perf arm-spe: Update --switch-events docs in 'perf record' +- perf arm-spe: Track task context switch for cpu-mode events +- perf arm-spe: Print size using consistent format +- perf arm-spe: Implement find_snapshot callback +- perf arm-spe: Snapshot mode test +- perf arm-spe: Add snapshot mode support +- perf arm-spe: Don't wait for PERF_RECORD_EXIT event +- perf arm-spe: Bail out if the trace is later than perf event +- perf arm-spe: Assign kernel time to synthesized event +- perf arm-spe: Convert event kernel time to counter value +- perf arm-spe: Save clock parameters from TIME_CONV event +- perf arm-spe: Remove redundant checking for "full_auxtrace" +- perf arm-spe: Enable timestamp for per-cpu mode +- perf arm-spe: Correct sample flags for dummy event +- perf arm-spe: Correct sample flags for SPE event +- perf arm-spe: Avoid potential buffer overrun +- perf arm-spe: Set sample's data source field +- perf arm-spe: Synthesize memory event +- perf arm-spe: Fill address info for samples +- perf arm-spe: Store operation type in packet +- perf arm-spe: Store memory address in packet +- perf arm-spe: Enable sample type PERF_SAMPLE_DATA_SRC +- perf c2c: Add local variables for output metrics +- perf c2c: Refactor node display +- perf c2c: Fix argument type for percent() +- perf c2c: Refactor display filter +- perf c2c: Refactor hist entry validation +- perf c2c: Rename for shared cache line stats +- perf arm-spe: Add support for ARMv8.3-SPE +- perf arm_spe: Decode memory tagging properties +- perf arm-spe: Add more sub classes for operation packet +- perf arm-spe: Refactor operation packet handling +- perf arm-spe: Add new function arm_spe_pkt_desc_op_type() +- perf arm-spe: Remove size condition checking for events +- perf arm-spe: Refactor event type handling +- perf arm-spe: Add new function arm_spe_pkt_desc_event() +- perf arm-spe: Refactor counter packet handling +- perf arm-spe: Add new function arm_spe_pkt_desc_counter() +- perf arm-spe: Refactor context packet handling +- perf arm_spe: Fixup top byte for data virtual address +- perf arm-spe: Refactor address packet handling +- perf arm-spe: Add new function arm_spe_pkt_desc_addr() +- perf arm-spe: Refactor packet header parsing +- perf arm-spe: Refactor printing string to buffer +- perf arm-spe: Fix packet length handling +- perf arm-spe: Refactor arm_spe_get_events() +- perf arm-spe: Refactor payload size calculation +- perf arm-spe: Fix a typo in comment +- perf arm-spe: Include bitops.h for BIT() macro +- perf mem: Support ARM SPE events +- perf c2c: Support AUX trace +- perf mem: Support AUX trace +- perf auxtrace: Add itrace option '-M' for memory events +- perf mem: Only initialize memory event for recording +- perf c2c: Support memory event PERF_MEM_EVENTS__LOAD_STORE +- perf mem: Support new memory event PERF_MEM_EVENTS__LOAD_STORE +- perf mem: Introduce weak function perf_mem_events__ptr() +- perf mem: Search event name with more flexible path +- share_pool: Use sharepool_no_page to alloc hugepage +- share_pool: Show sp vmflags in /proc/$pid/smaps +- share_pool: charge pages to the memcg of current task +- share_pool: Use node_id from spa when alloc share_pool memory +- share_pool: Don't allow non-sp mmap in sp address range +- share_pool: support fork() and exit() to handle the mm +- share_pool: Implement sp_group_del_task() +- share_pool: Implement sp_group_add_task() +- share_pool: Implement sp_alloc() +- share_pool: Implement sp_unshare_uva() +- share_pool: Implement sp_make_share_k2u() +- share_pool: Implement sp_free() +- share_pool: Implement sp_group_id_by_pid() +- share_pool: Implement sp_unshare_kva +- share_pool: Implement sp_make_share_u2k() +- share_pool: Compact memory when necessary +- share_pool: Add sp-area management code +- share_pool: Implement sp_walk_page_range() +- share_pool: Add VM_SHARE_POOL flag for vm_area_struct +- share_pool: Add proc interfaces to show sp info +- share_pool: Reserve the va space for share_pool +- share_pool: Add Statement for all the exported symbol +- share_pool: Add base framework for share_pool +- shmem: Alloc shared memory on a specified memory node +- memory: introduce do_mm_populate +- vmalloc: Extend for hugepages mapping +- mm/hugetlb: allocate huge page and setup page table +- timekeeping: Really make sure wall_to_monotonic isn't positive +- tracing/osnoise: Fix compile warning in function start_kthread +- configs: Enable osnoise and timerlat +- tracing: Have osnoise_main() add a quiescent state for task rcu +- tracing/osnoise: Make osnoise_instances static +- tracing/osnoise: Remove PREEMPT_RT ifdefs from inside functions +- tracing/osnoise: Remove STACKTRACE ifdefs from inside functions +- tracing/osnoise: Allow multiple instances of the same tracer +- tracing/osnoise: Remove TIMERLAT ifdefs from inside functions +- tracing: Disable "other" permission bits in the tracefs files +- tracing/osnoise: Support a list of trace_array *tr +- tracing/osnoise: Use start/stop_per_cpu_kthreads() on osnoise_cpus_write() +- tracing/osnoise: Split workload start from the tracer start +- tracing/osnoise: Improve comments about barrier need for NMI callbacks +- tracing/osnoise: Do not follow tracing_cpumask +- tracing: Fix missing osnoise tracer on max_latency +- tracing/osnoise: Fix missed cpus_read_unlock() in start_per_cpu_kthreads() +- trace/osnoise: Print a stop tracing message +- trace/osnoise: Make 'noise' variable s64 in run_osnoise() +- tracing: Fix spelling in osnoise tracer "interferences" -> "interference" +- Documentation: Fix a typo on trace/osnoise-tracer +- trace/osnoise: Fix return value on osnoise_init_hotplug_support +- trace/osnoise: Make interval u64 on osnoise_main +- trace/osnoise: Support hotplug operations +- trace/osnoise: Fix 'no previous prototype' warnings +- trace/osnoise: Fix an ifdef comment +- trace/osnoise: Add a header with PREEMPT_RT additional fields +- trace: Add timerlat tracer +- trace: Add osnoise tracer +- tracing: Merge irqflags + preempt counter. +- trace: Add __print_ns_to_secs() and __print_ns_without_secs() helpers +- trace: Add a generic function to read/write u64 values from tracefs +- driver core: auxiliary bus: Fix memory leak when driver_register() fail +- driver core: auxiliary bus: Remove unneeded module bits +- driver core: auxiliary bus: Fix calling stage for auxiliary bus init +- driver core: auxiliary bus: Fix auxiliary bus shutdown null auxdrv ptr +- driver core: auxiliary bus: minor coding style tweaks +- driver core: auxiliary bus: make remove function return void +- driver core: auxiliary bus: move slab.h from include file +- Add auxiliary bus support +- svm: Set CONFIG_HISI_SVM as m by default +- svm: Change svm to modules and remove unused functions +- arm64/ascend: Enable CONFIG_ASCEND_OOM for openeuler_defconfig +- arm64/ascend: Add new enable_oom_killer interface for oom contrl +- x86: Support huge vmalloc mappings +- arm64: Support huge vmalloc mappings +- mm: vmalloc: Let user to control huge vmalloc default behavior +- pid_ns: Make pid_max per namespace +- arm64/mpam: rmid: refine allocation and release process +- arm64/mpam: resctrl: add tips when rmid modification failed +- arm64/mpam: Fix mpam corrupt when cpu online +- vfio/mdev: Add missing error handling to dev_set_name() +- KVM: arm64: Restore PMU configuration on first run +- KVM: arm64: Refuse to run VCPU if PMU is not initialized +- KVM: arm64: Add kvm_vcpu_has_pmu() helper +- KVM: LAPIC: Keep stored TMCCT register value 0 after KVM_SET_LAPIC +- KVM: x86: Properly reset MMU context at vCPU RESET/INIT +- KVM: LAPIC: Write 0 to TMICT should also cancel vmx-preemption timer +- KVM: X86: Fix missing local pCPU when executing wbinvd on all dirty pCPUs +- kvm: SMM: fix losing SMI problem +- arm64: mm: support setting page attributes for debugging +- mm: emit the "free" trace report before freeing memory in kmem_cache_free() +- mm, page_alloc: disable pcplists during memory offline +- mm, page_alloc: move draining pcplists to page isolation users +- mm, page_alloc: cache pageset high and batch in struct zone +- mm, page_alloc: simplify pageset_update() +- mm, page_alloc: remove setup_pageset() +- mm, page_alloc: calculate pageset high and batch once per zone +- mm, page_alloc: clean up pageset high and batch update +- tools arch x86: Sync the msr-index.h copy with the kernel sources +- powercap: RAPL: Add AMD Fam19h RAPL support +- powercap: Add AMD Fam17h RAPL support +- powercap/intel_rapl_msr: Convert rapl_msr_priv into pointer +- x86/msr-index: sort AMD RAPL MSRs by address +- Revert "ima: Introduce ima namespace" +- Revert "ima: Add a list of the installed ima namespaces" +- Revert "ima: Bind ima namespace to the file descriptor" +- Revert "ima: Add ima policy related data to the ima namespace" +- Revert "ima: Add methods for parsing ima policy configuration string" +- Revert "ima: Add ima namespace to the ima subsystem APIs" +- Revert "ima: Extend the APIs in the integrity subsystem" +- Revert "ima: Add integrity inode related data to the ima namespace" +- Revert "ima: Enable per ima namespace policy settings" +- Revert "ima: Add ima namespace id to the measurement list related structures" +- Revert "ima: Keep track of the measurment list per ima namespace" +- Revert "ima: Check ima namespace ID during digest entry lookup" +- Revert "ima: Add a new ima template that includes namespace ID" +- Revert "ima: Add per namespace view of the measurement list" +- Revert "ima: Add a reader counter to the integrity inode data" +- Revert "ima: Extend permissions to the ima securityfs entries" +- Revert "ima: Add the violation counter to the namespace" +- Revert "ima: Change the owning user namespace of the ima namespace if necessary" +- Revert "ima: Configure the new ima namespace from securityfs" +- Revert "ima: Parse per ima namespace policy file" +- Revert "user namespace: Add function that checks if the UID map is defined" +- Revert "ima: Remap IDs of subject based rules if necessary" +- Revert "keys: Add domain tag to the keyring search criteria" +- Revert "keys: Include key domain tag in the iterative search" +- Revert "keys: Allow to set key domain tag separately from the key type" +- Revert "ima: Add key domain to the ima namespace" +- Revert "integrity: Add key domain tag to the search criteria" +- Revert "ima: Load per ima namespace x509 certificate" +- Revert "ima: Add dummy boot aggregate to per ima namespace measurement list" +- Revert "ima: Set ML template per ima namespace" +- Revert "ima: fix a potential crash owing to the compiler optimisation" +- Revert "ima: Introduce ima-ns-sig template" +- Revert "digest list: disable digest lists in non-root ima namespaces" +- Revert "imans: Use initial ima namespace domain tag when IMANS is disabled." +- Revert "imans: Check CAP_SYS_ADMIN in userns associated with IMA NS during configuration." +- config: enable CONFIG_ASCEND_CLEAN_CDM by default +- numa/cdm: Introduce a bootarg to specify the target nodes to move to +- numa: Move the management structures for cdm nodes to ddr +- tick/nohz: Call tick_nohz_task_switch() with interrupts disabled +- tick/nohz: Kick only _queued_ task whose tick dependency is updated +- tick/nohz: Change signal tick dependency to wake up CPUs of member tasks +- tick/nohz: Only wake up a single target cpu when kicking a task +- tick/nohz: Update idle_exittime on actual idle exit +- tick/nohz: Remove superflous check for CONFIG_VIRT_CPU_ACCOUNTING_NATIVE +- tick/nohz: Conditionally restart tick on idle exit +- tick/sched: Release seqcount before invoking calc_load_global() +- tick/sched: Optimize tick_do_update_jiffies64() further +- tick/sched: Reduce seqcount held scope in tick_do_update_jiffies64() +- tick/sched: Use tick_next_period for lockless quick check +- arm64: Revert feature: Add memmap parameter and register pmem +- crypto: hisilicon/zip - enable ssid for sva sgl +- crypto: hisilicon/zip - add new algorithms for uacce device +- PCI: fix the wrong class type for HiSilicon NP 5896 +- PCI: Fix SD5896 NP init failure +- fs: fix a hungtask problem when freeze/unfreeze fs +- PCI: Add support of port isolation for QLogic HBA card 26 +- xfs: fix chown leaking delalloc quota blocks when fssetxattr fails +- xfs: punch out data fork delalloc blocks on COW writeback failure +- xfs: use kmem_cache_free() for kmem_cache objects +- xfs: fix I_DONTCACHE +- xfs: only set IOMAP_F_SHARED when providing a srcmap to a write +- xfs: fix perag structure refcounting error when scrub fails +- xfs: make fsmap backend function key parameters const +- xfs: fix off-by-one error when the last rt extent is in use +- xfs: make xfs_rtalloc_query_range input parameters const +- xfs: replace kmem_alloc_large() with kvmalloc() +- xfs: remove kmem_alloc_io() +- mm: Add kvrealloc() +- xfs: introduce all-mounts list for cpu hotplug notifications +- xfs: introduce CPU hotplug infrastructure +- xfs: prevent spoofing of rtbitmap blocks when recovering buffers +- xfs: Enforce attr3 buffer recovery order +- xfs: logging the on disk inode LSN can make it go backwards +- xfs: avoid unnecessary waits in xfs_log_force_lsn() +- xfs: log forces imply data device cache flushes +- xfs: factor out forced iclog flushes +- xfs: fix ordering violation between cache flushes and tail updates +- xfs: fold __xlog_state_release_iclog into xlog_state_release_iclog +- xfs: external logs need to flush data device +- xfs: flush data dev on external log write +- xfs: fix an integer overflow error in xfs_growfs_rt +- xfs: reset child dir '..' entry when unlinking child +- xfs: don't wait on future iclogs when pushing the CIL +- xfs: Fix a CIL UAF by getting get rid of the iclog callback lock +- xfs: remove callback dequeue loop from xlog_state_do_iclog_callbacks +- xfs: don't nest icloglock inside ic_callback_lock +- xfs: force the log offline when log intent item recovery fails +- xfs: fix log intent recovery ENOSPC shutdowns when inactivating inodes +- xfs: xfs_log_force_lsn isn't passed a LSN +- xfs: Fix CIL throttle hang when CIL space used going backwards +- xfs: journal IO cache flush reductions +- xfs: remove need_start_rec parameter from xlog_write() +- xfs: CIL checkpoint flushes caches unconditionally +- xfs: async blkdev cache flush +- xfs: separate CIL commit record IO +- xfs: Fix 64-bit division on 32-bit in xlog_state_switch_iclogs() +- xfs: log stripe roundoff is a property of the log +- xfs: only reset incore inode health state flags when reclaiming an inode +- xfs: don't take a spinlock unconditionally in the DIO fastpath +- xfs: bunmapi has unnecessary AG lock ordering issues +- xfs: btree format inode forks can have zero extents +- xfs: Fix fall-through warnings for Clang +- xfs: don't reset log idle state on covering checkpoints +- xfs: check free AG space when making per-AG reservations +- xfs: unconditionally read all AGFs on mounts with perag reservation +- xfs: fix deadlock retry tracepoint arguments +- xfs: fix scrub and remount-ro protection when running scrub +- xfs: fix xfs_reflink_unshare usage of filemap_write_and_wait_range +- xfs: count free space btree blocks when scrubbing pre-lazysbcount fses +- xfs: update superblock counters correctly for !lazysbcount +- xfs: don't check agf_btreeblks on pre-lazysbcount filesystems +- xfs: remove obsolete AGF counter debugging +- xfs: drop submit side trans alloc for append ioends +- net: hns3: Fix spelling mistake "faile" -> "failed" +- net: hns3: fix hns3 driver header file not self-contained issue +- net: hns3: replace one tab with space in for statement +- net: hns3: remove rebundant line for hclge_dbg_dump_tm_pg() +- net: hns3: add comments for hclge_dbg_fill_content() +- net: hns3: align return value type of atomic_read() with its output +- net: hns3: modify one argument type of function hclge_ncl_config_data_print +- net: hns3: Align type of some variables with their print type +- net: hns3: add print vport id for failed message of vlan +- net: hns3: refactor function hclge_set_vlan_filter_hw +- net: hns3: optimize function hclge_cfg_common_loopback() +- net: hns3: refactor function hns3_get_vector_ring_chain() +- net: hns3: refactor function hclge_set_channels() +- net: hns3: refactor function hclge_configure() +- net: hns3: split function hclge_update_port_base_vlan_cfg() +- net: hns3: split function hns3_nic_net_xmit() +- net: hns3: split function hclge_get_fd_rule_info() +- net: hns3: split function hclge_init_vlan_config() +- net: hns3: refactor function hns3_fill_skb_desc to simplify code +- net: hns3: extract macro to simplify ring stats update code +- net: hns3: make symbol 'hclge_mac_speed_map_to_fw' static +- net: hns3: split function hns3_set_l2l3l4() +- net: hns3: split function hns3_handle_bdinfo() +- net: hns3: split function hns3_nic_get_stats64() +- net: hns3: refine function hclge_tm_pri_q_qs_cfg() +- net: hns3: add new function hclge_tm_schd_mode_tc_base_cfg() +- net: hns3: refine function hclge_cfg_mac_speed_dup_hw() +- net: hns3: split function hns3_get_tx_timeo_queue_info() +- net: hns3: refactor two hns3 debugfs functions +- net: hns3: refactor hns3_nic_reuse_page() +- net: hns3: refactor reset_prepare_general retry statement +- net: hns3: use macro IANA_VXLAN_GPE_UDP_PORT to replace number 4790 +- net: vxlan: add macro definition for number of IANA VXLAN-GPE port +- net: hns3: fix incorrect components info of ethtool --reset command +- net: hns3: fix one incorrect value of page pool info when queried by debugfs +- net: hns3: add check NULL address for page pool +- net: hns3: fix VF RSS failed problem after PF enable multi-TCs +- net: hns3: add dql info when tx timeout +- net: hns3: debugfs add drop packet statistics of multicast and broadcast for igu +- net: hns3: format the output of the MAC address +- net: hns3: add log for workqueue scheduled late +- net: hns3: remove the way to set tx spare buf via module parameter +- net: hns3: add support to set/get rx buf len via ethtool for hns3 driver +- ethtool: extend ringparam setting/getting API with rx_buf_len +- ethtool: add support to set/get rx buf len via ethtool +- net: hns3: add support to set/get tx copybreak buf size via ethtool for hns3 driver +- ethtool: add support to set/get tx copybreak buf size via ethtool +- vhost_net: avoid tx queue stuck when sendmsg fails +- crypto: x86/sm4 - Fix invalid section entry size +- crypto: sm4 - Do not change section of ck and sbox +- crypto: x86/sm4 - Fix frame pointer stack corruption +- Add the configuration for accelerated of SM4 +- crypto: x86/sm4 - add AES-NI/AVX2/x86_64 implementation +- crypto: x86/sm4 - export reusable AESNI/AVX functions +- crypto: tcrypt - add the asynchronous speed test for SM4 +- crypto: x86/sm4 - add AES-NI/AVX/x86_64 implementation +- crypto: arm64/sm4-ce - Make dependent on sm4 library instead of sm4-generic +- crypto: sm4 - create SM4 library based on sm4 generic code +- crypto: tcrypt - add GCM/CCM mode test for SM4 algorithm +- crypto: testmgr - Add GCM/CCM mode test of SM4 algorithm +- crypto: tcrypt - Fix missing return value check +- ipvlan: limit loop_qlen ranges +- ipvlan: limit loop_delay ranges +- ipvlan: Introduce local xmit queue for l2e mode +- ipvlan: check the value of module parameter ipvlan_default_mode +- ipvlan: Introduce l2e mode +- mpam: update monitor rmid and group configuration +- mpam: Add support for group rmid modify +- mpam: enable rdt_mon_capable for mbw monitor +- iommu/arm-smmu-v3: Add support to enable/disable SMMU user_mpam_en +- iommu/arm-smmu-v3: Add support to get SMMU mpam configuration +- iommu/arm-smmu-v3: Add support to configure mpam in STE/CD context +- iommu: add iommu interface to set/get device configuration +- block/wbt: fix negative inflight counter when remove scsi device +- md/raid1: fix a race between removing rdev and access conf->mirrors[i].rdev +- arm64/ascend: Enable CONFIG_ASCEND_DVPP_MMAP +- arm64/ascend: Enable DvPP mmap features for Ascend Platform +- arm64: openeuler_defconfig: Adjust page size to 4K and VA_BITS to 48 +- openeuler_defconfig: Adjust CONFIG_NODES_SHIFT to 7 +- arm64: openeuler_defconfig: increase CONFIG_NR_CPUS value to 4096 +- audit: ensure userspace is penalized the same as the kernel when under pressure +- audit: improve robustness of the audit queue handling +- arm32: kaslr: Bugfix of initrd size calculation when enabled kaslr +- drm/hisilicon: Features to support reading resolutions from EDID +- drm/hisilicon: Support i2c driver algorithms for bit-shift adapters +- mm: Change tmpfs size base on ddr size. +- SUNRPC: Close a race with transport setup and module put +- sched: Introduce handle priority reversion mechanism +- mm: Check numa node hugepages enough when mmap hugetlb +- block: return errors from blk_execute_rq() +- blk: Fix lock inversion between ioc lock and bfqd lock +- bfq: Remove merged request already in bfq_requests_merged() + +* Fri Dec 24 2021 Zheng Zengkai - 5.10.0-25.0.0.16 +- selftests/x86/iopl: Adjust to the faked iopl CLI/STI usage +- thermal: Fix NULL pointer dereferences in of_thermal_ functions +- perf/core: Avoid put_page() when GUP fails +- scripts/lld-version.sh: Rewrite based on upstream ld-version.sh +- erofs: fix unsafe pagevec reuse of hooked pclusters +- erofs: remove the occupied parameter from z_erofs_pagevec_enqueue() +- PCI: Add MSI masking quirk for Nvidia ION AHCI +- PCI/MSI: Deal with devices lying about their MSI mask capability +- PCI/MSI: Destroy sysfs before freeing entries +- parisc/entry: fix trace test in syscall exit path +- x86/iopl: Fake iopl(3) CLI/STI usage +- net: stmmac: dwmac-rk: fix unbalanced pm_runtime_enable warnings +- net: stmmac: fix issue where clk is being unprepared twice +- net: stmmac: fix system hang if change mac address after interface ifdown +- net: stmmac: fix missing unlock on error in stmmac_suspend() +- net: stmmac: platform: fix build error with !CONFIG_PM_SLEEP +- net: stmmac: add clocks management for gmac driver +- bootconfig: init: Fix memblock leak in xbc_make_cmdline() +- loop: Use blk_validate_block_size() to validate block size +- block: Add a helper to validate the block size +- fortify: Explicitly disable Clang support +- soc/tegra: pmc: Fix imbalanced clock disabling in error code path +- x86/sev: Make the #VC exception stacks part of the default stacks storage +- x86/sev: Add an x86 version of cc_platform_has() +- arch/cc: Introduce a function to check for confidential computing features +- selftests/bpf: Fix also no-alu32 strobemeta selftest +- mmc: moxart: Fix null pointer dereference on pointer host +- ath10k: fix invalid dma_addr_t token assignment +- SUNRPC: Partial revert of commit 6f9f17287e78 +- PCI: aardvark: Fix PCIe Max Payload Size setting +- PCI: Add PCI_EXP_DEVCTL_PAYLOAD_* macros +- drm/sun4i: Fix macros in sun8i_csc.h +- powerpc/85xx: fix timebase sync issue when CONFIG_HOTPLUG_CPU=n +- powerpc/powernv/prd: Unregister OPAL_MSG_PRD2 notifier during module unload +- mtd: rawnand: au1550nd: Keep the driver compatible with on-die ECC engines +- mtd: rawnand: plat_nand: Keep the driver compatible with on-die ECC engines +- mtd: rawnand: orion: Keep the driver compatible with on-die ECC engines +- mtd: rawnand: pasemi: Keep the driver compatible with on-die ECC engines +- mtd: rawnand: gpio: Keep the driver compatible with on-die ECC engines +- mtd: rawnand: mpc5121: Keep the driver compatible with on-die ECC engines +- mtd: rawnand: xway: Keep the driver compatible with on-die ECC engines +- mtd: rawnand: ams-delta: Keep the driver compatible with on-die ECC engines +- s390/cio: make ccw_device_dma_* more robust +- s390/ap: Fix hanging ioctl caused by orphaned replies +- s390/tape: fix timer initialization in tape_std_assign() +- s390/cio: check the subchannel validity for dev_busid +- video: backlight: Drop maximum brightness override for brightness zero +- mfd: dln2: Add cell for initializing DLN2 ADC +- mm, oom: do not trigger out_of_memory from the #PF +- mm, oom: pagefault_out_of_memory: don't force global OOM for dying tasks +- powerpc/bpf: Emit stf barrier instruction sequences for BPF_NOSPEC +- powerpc/security: Add a helper to query stf_barrier type +- powerpc/bpf: Validate branch ranges +- powerpc/lib: Add helper to check if offset is within conditional branch range +- memcg: prohibit unconditional exceeding the limit of dying tasks +- 9p/net: fix missing error check in p9_check_errors +- net, neigh: Enable state migration between NUD_PERMANENT and NTF_USE +- f2fs: should use GFP_NOFS for directory inodes +- irqchip/sifive-plic: Fixup EOI failed when masked +- posix-cpu-timers: Clear task::posix_cputimers_work in copy_process() +- x86/mce: Add errata workaround for Skylake SKX37 +- MIPS: Fix assembly error from MIPSr2 code used within MIPS_ISA_ARCH_LEVEL +- parisc: Fix backtrace to always include init funtion names +- ARM: 9156/1: drop cc-option fallbacks for architecture selection +- ARM: 9155/1: fix early early_iounmap() +- selftests/net: udpgso_bench_rx: fix port argument +- cxgb4: fix eeprom len when diagnostics not implemented +- net/smc: fix sk_refcnt underflow on linkdown and fallback +- vsock: prevent unnecessary refcnt inc for nonblocking connect +- net: stmmac: allow a tc-taprio base-time of zero +- net/sched: sch_taprio: fix undefined behavior in ktime_mono_to_any +- seq_file: fix passing wrong private data +- gve: Fix off by one in gve_tx_timeout() +- bpf: sockmap, strparser, and tls are reusing qdisc_skb_cb and colliding +- bpf, sockmap: Remove unhash handler for BPF sockmap usage +- arm64: pgtable: make __pte_to_phys/__phys_to_pte_val inline functions +- nfc: pn533: Fix double free when pn533_fill_fragment_skbs() fails +- llc: fix out-of-bound array index in llc_sk_dev_hash() +- perf bpf: Add missing free to bpf_event__print_bpf_prog_info() +- zram: off by one in read_block_state() +- mm/zsmalloc.c: close race window between zs_pool_dec_isolated() and zs_unregister_migration() +- can: mcp251xfd: mcp251xfd_chip_start(): fix error handling for mcp251xfd_chip_rx_int_enable() +- mfd: core: Add missing of_node_put for loop iteration +- drm/nouveau/svm: Fix refcount leak bug and missing check against null bug +- ACPI: PMIC: Fix intel_pmic_regs_handler() read accesses +- ice: Fix not stopping Tx queues for VFs +- ice: Fix replacing VF hardware MAC to existing MAC filter +- net: vlan: fix a UAF in vlan_dev_real_dev() +- openrisc: fix SMP tlb flush NULL pointer dereference +- ethtool: fix ethtool msg len calculation for pause stats +- net: davinci_emac: Fix interrupt pacing disable +- xen-pciback: Fix return in pm_ctrl_init() +- i2c: xlr: Fix a resource leak in the error handling path of 'xlr_i2c_probe()' +- NFSv4: Fix a regression in nfs_set_open_stateid_locked() +- scsi: qla2xxx: Turn off target reset during issue_lip +- scsi: qla2xxx: Fix gnl list corruption +- scsi: qla2xxx: Relogin during fabric disturbance +- scsi: qla2xxx: Changes to support FCP2 Target +- ar7: fix kernel builds for compiler test +- watchdog: f71808e_wdt: fix inaccurate report in WDIOC_GETTIMEOUT +- m68k: set a default value for MEMORY_RESERVE +- signal/sh: Use force_sig(SIGKILL) instead of do_group_exit(SIGKILL) +- dmaengine: dmaengine_desc_callback_valid(): Check for `callback_result` +- netfilter: nfnetlink_queue: fix OOB when mac header was cleared +- soc: fsl: dpaa2-console: free buffer before returning from dpaa2_console_read +- auxdisplay: ht16k33: Fix frame buffer device blanking +- auxdisplay: ht16k33: Connect backlight to fbdev +- auxdisplay: img-ascii-lcd: Fix lock-up when displaying empty string +- Fix user namespace leak +- NFS: Fix an Oops in pnfs_mark_request_commit() +- NFS: Fix up commit deadlocks +- dmaengine: at_xdmac: fix AT_XDMAC_CC_PERID() macro +- rtc: rv3032: fix error handling in rv3032_clkout_set_rate() +- remoteproc: Fix a memory leak in an error handling path in 'rproc_handle_vdev()' +- mtd: core: don't remove debugfs directory if device is in use +- PCI: uniphier: Serialize INTx masking/unmasking and fix the bit operation +- mtd: spi-nor: hisi-sfc: Remove excessive clk_disable_unprepare() +- fs: orangefs: fix error return code of orangefs_revalidate_lookup() +- NFS: Fix deadlocks in nfs_scan_commit_list() +- opp: Fix return in _opp_add_static_v2() +- PCI: aardvark: Fix preserving PCI_EXP_RTCTL_CRSSVE flag on emulated bridge +- PCI: aardvark: Don't spam about PIO Response Status +- drm/plane-helper: fix uninitialized variable reference +- pnfs/flexfiles: Fix misplaced barrier in nfs4_ff_layout_prepare_ds +- NFS: Fix dentry verifier races +- i2c: mediatek: fixing the incorrect register offset +- nfsd: don't alloc under spinlock in rpc_parse_scope_id +- rpmsg: Fix rpmsg_create_ept return when RPMSG config is not defined +- apparmor: fix error check +- power: supply: bq27xxx: Fix kernel crash on IRQ handler register error +- mips: cm: Convert to bitfield API to fix out-of-bounds access +- virtio_ring: check desc == NULL when using indirect with packed +- ASoC: cs42l42: Correct configuring of switch inversion from ts-inv +- ASoC: cs42l42: Use device_property API instead of of_property +- ASoC: cs42l42: Disable regulators if probe fails +- powerpc/44x/fsp2: add missing of_node_put +- HID: u2fzero: properly handle timeouts in usb_submit_urb +- HID: u2fzero: clarify error check and length calculations +- clk: at91: sam9x60-pll: use DIV_ROUND_CLOSEST_ULL +- serial: xilinx_uartps: Fix race condition causing stuck TX +- phy: qcom-snps: Correct the FSEL_MASK +- phy: ti: gmii-sel: check of_get_address() for failure +- phy: qcom-qusb2: Fix a memory leak on probe +- pinctrl: equilibrium: Fix function addition in multiple groups +- soc: qcom: apr: Add of_node_put() before return +- firmware: qcom_scm: Fix error retval in __qcom_scm_is_call_available() +- usb: dwc2: drd: reset current session before setting the new one +- usb: dwc2: drd: fix dwc2_drd_role_sw_set when clock could be disabled +- usb: dwc2: drd: fix dwc2_force_mode call in dwc2_ovr_init +- serial: imx: fix detach/attach of serial console +- scsi: ufs: ufshcd-pltfrm: Fix memory leak due to probe defer +- scsi: ufs: Refactor ufshcd_setup_clocks() to remove skip_ref_clk +- iio: adis: do not disabe IRQs in 'adis_init()' +- usb: typec: STUSB160X should select REGMAP_I2C +- soc: qcom: rpmhpd: Make power_on actually enable the domain +- soc: qcom: rpmhpd: Provide some missing struct member descriptions +- ASoC: cs42l42: Defer probe if request_threaded_irq() returns EPROBE_DEFER +- ASoC: cs42l42: Correct some register default values +- ARM: dts: stm32: fix AV96 board SAI2 pin muxing on stm32mp15 +- ARM: dts: stm32: fix SAI sub nodes register range +- ARM: dts: stm32: Reduce DHCOR SPI NOR frequency to 50 MHz +- pinctrl: renesas: checker: Fix off-by-one bug in drive register check +- staging: ks7010: select CRYPTO_HASH/CRYPTO_MICHAEL_MIC +- staging: most: dim2: do not double-register the same device +- usb: musb: select GENERIC_PHY instead of depending on it +- RDMA/mlx4: Return missed an error if device doesn't support steering +- scsi: csiostor: Uninitialized data in csio_ln_vnp_read_cbfn() +- power: supply: max17040: fix null-ptr-deref in max17040_probe() +- power: supply: rt5033_battery: Change voltage values to µV +- usb: gadget: hid: fix error code in do_config() +- serial: 8250_dw: Drop wrong use of ACPI_PTR() +- powerpc: fix unbalanced node refcount in check_kvm_guest() +- powerpc: Fix is_kvm_guest() / kvm_para_available() +- powerpc: Reintroduce is_kvm_guest() as a fast-path check +- powerpc: Rename is_kvm_guest() to check_kvm_guest() +- powerpc: Refactor is_kvm_guest() declaration to new header +- video: fbdev: chipsfb: use memset_io() instead of memset() +- clk: at91: check pmc node status before registering syscore ops +- memory: fsl_ifc: fix leak of irq and nand_irq in fsl_ifc_ctrl_probe +- soc/tegra: Fix an error handling path in tegra_powergate_power_up() +- ASoC: SOF: topology: do not power down primary core during topology removal +- arm: dts: omap3-gta04a4: accelerometer irq fix +- driver core: Fix possible memory leak in device_link_add() +- scsi: pm80xx: Fix misleading log statement in pm8001_mpi_get_nvmd_resp() +- soundwire: debugfs: use controller id and link_id for debugfs +- ALSA: hda: Use position buffer for SKL+ again +- ALSA: hda: Fix hang during shutdown due to link reset +- ALSA: hda: Release controller display power during shutdown/reboot +- ALSA: hda: Reduce udelay() at SKL+ position reporting +- arm64: dts: qcom: pm8916: Remove wrong reg-names for rtc@6000 +- arm64: dts: renesas: beacon: Fix Ethernet PHY mode +- arm64: dts: qcom: msm8916: Fix Secondary MI2S bit clock +- JFS: fix memleak in jfs_mount +- MIPS: loongson64: make CPU_LOONGSON64 depends on MIPS_FP_SUPPORT +- scsi: dc395: Fix error case unwinding +- ARM: dts: at91: tse850: the emac<->phy interface is rmii +- bus: ti-sysc: Fix timekeeping_suspended warning on resume +- arm64: dts: meson-g12b: Fix the pwm regulator supply properties +- arm64: dts: meson-g12a: Fix the pwm regulator supply properties +- arm64: dts: ti: k3-j721e-main: Fix "bus-range" upto 256 bus number for PCIe +- arm64: dts: ti: k3-j721e-main: Fix "max-virtual-functions" in PCIe EP nodes +- RDMA/bnxt_re: Fix query SRQ failure +- ARM: dts: qcom: msm8974: Add xo_board reference clock to DSI0 PHY +- arm64: dts: rockchip: Fix GPU register width for RK3328 +- ARM: s3c: irq-s3c24xx: Fix return value check for s3c24xx_init_intc() +- clk: mvebu: ap-cpu-clk: Fix a memory leak in error handling paths +- ARM: dts: BCM5301X: Fix memory nodes names +- RDMA/rxe: Fix wrong port_cap_flags +- iio: st_sensors: disable regulators after device unregistration +- iio: st_sensors: Call st_sensors_power_enable() from bus drivers +- of: unittest: fix EXPECT text for gpio hog errors +- bpf: Fix propagation of signed bounds from 64-bit min/max into 32-bit. +- bpf: Fix propagation of bounds from 64-bit min/max into 32-bit and var_off. +- cgroup: Fix rootcg cpu.stat guest double counting +- ibmvnic: Process crqs after enabling interrupts +- ibmvnic: don't stop queue in xmit +- udp6: allow SO_MARK ctrl msg to affect routing +- selftests/bpf: Fix fclose/pclose mismatch in test_progs +- crypto: pcrypt - Delay write to padata->info +- net: phylink: avoid mvneta warning when setting pause parameters +- net: amd-xgbe: Toggle PLL settings during rate change +- selftests/bpf: Fix fd cleanup in sk_lookup test +- selftests: bpf: Convert sk_lookup ctx access tests to PROG_TEST_RUN +- drm/amdgpu/gmc6: fix DMA mask from 44 to 40 bits +- wcn36xx: Fix discarded frames due to wrong sequence number +- wcn36xx: add proper DMA memory barriers in rx path +- libertas: Fix possible memory leak in probe and disconnect +- libertas_tf: Fix possible memory leak in probe and disconnect +- KVM: s390: Fix handle_sske page fault handling +- samples/kretprobes: Fix return value if register_kretprobe() failed +- spi: spi-rpc-if: Check return value of rpcif_sw_init() +- tcp: don't free a FIN sk_buff in tcp_remove_empty_skb() +- libbpf: Fix endianness detection in BPF_CORE_READ_BITFIELD_PROBED() +- tpm_tis_spi: Add missing SPI ID +- tpm: fix Atmel TPM crash caused by too frequent queries +- irq: mips: avoid nested irq_enter() +- KVM: s390: pv: avoid stalls for kvm_s390_pv_init_vm +- KVM: s390: pv: avoid double free of sida page +- s390/gmap: don't unconditionally call pte_unmap_unlock() in __gmap_zap() +- libbpf: Fix BTF header parsing checks +- libbpf: Fix overflow in BTF sanity checks +- libbpf: Allow loading empty BTFs +- libbpf: Fix BTF data layout checks and allow empty BTF +- bpftool: Avoid leaking the JSON writer prepared for program metadata +- KVM: selftests: Fix nested SVM tests when built with clang +- KVM: selftests: Add operand to vmsave/vmload/vmrun in svm.c +- smackfs: use netlbl_cfg_cipsov4_del() for deleting cipso_v4_doi +- drm/msm: Fix potential NULL dereference in DPU SSPP +- x86/sev: Fix stack type check in vc_switch_off_ist() +- clocksource/drivers/timer-ti-dm: Select TIMER_OF +- PM: hibernate: fix sparse warnings +- nvme-rdma: fix error code in nvme_rdma_setup_ctrl +- phy: micrel: ksz8041nl: do not use power down mode +- net: enetc: unmap DMA in enetc_send_cmd() +- mwifiex: Send DELBA requests according to spec +- rsi: stop thread firstly in rsi_91x_init() error handling +- mt76: mt7915: fix muar_idx in mt7915_mcu_alloc_sta_req() +- mt76: mt7915: fix sta_rec_wtbl tag len +- mt76: mt7915: fix possible infinite loop release semaphore +- mt76: mt76x02: fix endianness warnings in mt76x02_mac.c +- mt76: mt7615: fix endianness warning in mt7615_mac_write_txwi +- platform/x86: thinkpad_acpi: Fix bitwise vs. logical warning +- mmc: mxs-mmc: disable regulator on error and in the remove function +- media: ir_toy: assignment to be16 should be of correct type +- net: stream: don't purge sk_error_queue in sk_stream_kill_queues() +- drm/msm: uninitialized variable in msm_gem_import() +- drm/msm: potential error pointer dereference in init() +- tcp: switch orphan_count to bare per-cpu counters +- kernel/sched: Fix sched_fork() access an invalid sched_task_group +- ath10k: fix max antenna gain unit +- hwmon: (pmbus/lm25066) Let compiler determine outer dimension of lm25066_coeff +- hwmon: Fix possible memleak in __hwmon_device_register() +- net, neigh: Fix NTF_EXT_LEARNED in combination with NTF_USE +- memstick: jmb38x_ms: use appropriate free function in jmb38x_ms_alloc_host() +- memstick: avoid out-of-range warning +- mmc: sdhci-omap: Fix context restore +- mmc: sdhci-omap: Fix NULL pointer exception if regulator is not configured +- gve: Recover from queue stall due to missed IRQ +- b43: fix a lower bounds test +- b43legacy: fix a lower bounds test +- hwrng: mtk - Force runtime pm ops for sleep ops +- crypto: qat - disregard spurious PFVF interrupts +- crypto: qat - detect PFVF collision after ACK +- media: dvb-frontends: mn88443x: Handle errors of clk_prepare_enable() +- netfilter: nft_dynset: relax superfluous check on set updates +- rcu: Always inline rcu_dynticks_task*_{enter,exit}() +- EDAC/amd64: Handle three rank interleaving mode +- PM: EM: Fix inefficient states detection +- ath9k: Fix potential interrupt storm on queue reset +- media: em28xx: Don't use ops->suspend if it is NULL +- cpuidle: Fix kobject memory leaks in error paths +- crypto: ecc - fix CRYPTO_DEFAULT_RNG dependency +- kprobes: Do not use local variable when creating debugfs file +- media: cx23885: Fix snd_card_free call on null card pointer +- media: tm6000: Avoid card name truncation +- media: si470x: Avoid card name truncation +- media: radio-wl1273: Avoid card name truncation +- media: mtk-vpu: Fix a resource leak in the error handling path of 'mtk_vpu_probe()' +- media: TDA1997x: handle short reads of hdmi info frame. +- media: v4l2-ioctl: S_CTRL output the right value +- media: dvb-usb: fix ununit-value in az6027_rc_query +- media: cxd2880-spi: Fix a null pointer dereference on error handling path +- media: em28xx: add missing em28xx_close_extension +- drm/amdgpu: fix warning for overflow check +- arm64: mm: update max_pfn after memory hotplug +- drm/ttm: stop calling tt_swapin in vm_access +- ath10k: sdio: Add missing BH locking around napi_schdule() +- ath10k: Fix missing frame timestamp for beacon/probe-resp +- ath11k: Fix memory leak in ath11k_qmi_driver_event_work +- ath11k: fix packet drops due to incorrect 6 GHz freq value in rx status +- ath11k: Avoid race during regd updates +- ath11k: fix some sleeping in atomic bugs +- net: dsa: rtl8366rb: Fix off-by-one bug +- rxrpc: Fix _usecs_to_jiffies() by using usecs_to_jiffies() +- crypto: caam - disable pkc for non-E SoCs +- Bluetooth: btmtkuart: fix a memleak in mtk_hci_wmt_sync +- wilc1000: fix possible memory leak in cfg_scan_result() +- wcn36xx: Fix Antenna Diversity Switching +- cgroup: Make rebind_subsystems() disable v2 controllers all at once +- net: net_namespace: Fix undefined member in key_remove_domain() +- lockdep: Let lock_is_held_type() detect recursive read as read +- virtio-gpu: fix possible memory allocation failure +- drm/v3d: fix wait for TMU write combiner flush +- objtool: Fix static_call list generation +- x86/xen: Mark cpu_bringup_and_idle() as dead_end_function +- objtool: Add xen_start_kernel() to noreturn list +- MIPS: lantiq: dma: fix burst length for DEU +- rcu: Fix existing exp request check in sync_sched_exp_online_cleanup() +- Bluetooth: fix init and cleanup of sco_conn.timeout_work +- selftests/bpf: Fix strobemeta selftest regression +- netfilter: conntrack: set on IPS_ASSURED if flows enters internal stream state +- parisc/kgdb: add kgdb_roundup() to make kgdb work with idle polling +- parisc/unwind: fix unwinder when CONFIG_64BIT is enabled +- erofs: don't trigger WARN() when decompression fails +- task_stack: Fix end_of_stack() for architectures with upwards-growing stack +- parisc: fix warning in flush_tlb_all +- selftests/core: fix conflicting types compile error for close_range() +- drm/amd/display: dcn20_resource_construct reduce scope of FPU enabled +- x86/hyperv: Protect set_hv_tscchange_cb() against getting preempted +- wcn36xx: Correct band/freq reporting on RX +- spi: bcm-qspi: Fix missing clk_disable_unprepare() on error in bcm_qspi_probe() +- btrfs: do not take the uuid_mutex in btrfs_rm_device +- btrfs: reflink: initialize return value to 0 in btrfs_extent_same() +- ACPI: AC: Quirk GK45 to skip reading _PSR +- net: annotate data-race in neigh_output() +- vrf: run conntrack only in context of lower/physdev for locally generated packets +- ARM: 9136/1: ARMv7-M uses BE-8, not BE-32 +- gfs2: Fix glock_hash_walk bugs +- gfs2: Cancel remote delete work asynchronously +- gre/sit: Don't generate link-local addr if addr_gen_mode is IN6_ADDR_GEN_MODE_NONE +- ARM: clang: Do not rely on lr register for stacktrace +- smackfs: use __GFP_NOFAIL for smk_cipso_doi() +- iwlwifi: mvm: disable RX-diversity in powersave +- selftests/bpf: Fix perf_buffer test on system with offline cpus +- selftests: kvm: fix mismatched fclose() after popen() +- nvme: drop scan_lock and always kick requeue list when removing namespaces +- nvmet-tcp: fix use-after-free when a port is removed +- nvmet-rdma: fix use-after-free when a port is removed +- nvmet: fix use-after-free when a port is removed +- media: allegro: ignore interrupt if mailbox is not initialized +- block: remove inaccurate requeue check +- mwl8k: Fix use-after-free in mwl8k_fw_state_machine() +- mt76: mt7915: fix an off-by-one bound check +- tracing/cfi: Fix cmp_entries_* functions signature mismatch +- workqueue: make sysfs of unbound kworker cpumask more clever +- lib/xz: Validate the value before assigning it to an enum variable +- lib/xz: Avoid overlapping memcpy() with invalid input with in-place decompression +- memstick: r592: Fix a UAF bug when removing the driver +- md: update superblock after changing rdev flags in state_store +- block: bump max plugged deferred size from 16 to 32 +- drm/msm: prevent NULL dereference in msm_gpu_crashstate_capture() +- leaking_addresses: Always print a trailing newline +- net: phy: micrel: make *-skew-ps check more lenient +- drm/amdkfd: fix resume error when iommu disabled in Picasso +- ACPI: battery: Accept charges over the design capacity as full +- iov_iter: Fix iov_iter_get_pages{,_alloc} page fault return value +- mmc: moxart: Fix reference count leaks in moxart_probe +- ath: dfs_pattern_detector: Fix possible null-pointer dereference in channel_detector_create() +- tracefs: Have tracefs directories not set OTH permission bits by default +- net-sysfs: try not to restart the syscall if it will fail eventually +- media: usb: dvd-usb: fix uninit-value bug in dibusb_read_eeprom_byte() +- media: ipu3-imgu: VIDIOC_QUERYCAP: Fix bus_info +- media: ipu3-imgu: imgu_fmt: Handle properly try +- ACPICA: Avoid evaluating methods too early during system resume +- fs/proc/uptime.c: Fix idle time reporting in /proc/uptime +- ipmi: Disable some operations during a panic +- media: rcar-csi2: Add checking to rcsi2_start_receiver() +- brcmfmac: Add DMI nvram filename quirk for Cyberbook T116 tablet +- rtw88: fix RX clock gate setting while fifo dump +- ia64: don't do IA64_CMPXCHG_DEBUG without CONFIG_PRINTK +- media: mceusb: return without resubmitting URB in case of -EPROTO error. +- media: imx: set a media_device bus_info string +- media: s5p-mfc: Add checking to s5p_mfc_probe(). +- media: s5p-mfc: fix possible null-pointer dereference in s5p_mfc_probe() +- media: uvcvideo: Set unique vdev name based in type +- media: uvcvideo: Return -EIO for control errors +- media: uvcvideo: Set capability in s_param +- media: stm32: Potential NULL pointer dereference in dcmi_irq_thread() +- media: atomisp: Fix error handling in probe +- media: netup_unidvb: handle interrupt properly according to the firmware +- media: mt9p031: Fix corrupted frame after restarting stream +- ath10k: high latency fixes for beacon buffer +- ath11k: Change DMA_FROM_DEVICE to DMA_TO_DEVICE when map reinjected packets +- ath11k: add handler for scan event WMI_SCAN_EVENT_DEQUEUED +- ath11k: Avoid reg rules update during firmware recovery +- drm/amdgpu: Fix MMIO access page fault +- fscrypt: allow 256-bit master keys with AES-256-XTS +- mwifiex: Properly initialize private structure on interface type changes +- mwifiex: Run SET_BSS_MODE when changing from P2P to STATION vif-type +- x86: Increase exception stack sizes +- ath11k: Align bss_chan_info structure with firmware +- smackfs: Fix use-after-free in netlbl_catmap_walk() +- rcu-tasks: Move RTGS_WAIT_CBS to beginning of rcu_tasks_kthread() loop +- net: sched: update default qdisc visibility after Tx queue cnt changes +- locking/lockdep: Avoid RCU-induced noinstr fail +- MIPS: lantiq: dma: reset correct number of channel +- MIPS: lantiq: dma: add small delay after reset +- platform/x86: wmi: do not fail if disabling fails +- rcutorture: Avoid problematic critical section nesting on PREEMPT_RT +- drm/panel-orientation-quirks: add Valve Steam Deck +- drm: panel-orientation-quirks: Add quirk for the Samsung Galaxy Book 10.6 +- drm: panel-orientation-quirks: Add quirk for KD Kurio Smart C15200 2-in-1 +- drm: panel-orientation-quirks: Update the Lenovo Ideapad D330 quirk (v2) +- dma-buf: WARN on dmabuf release with pending attachments +- power: supply: max17042_battery: Clear status bits in interrupt handler +- USB: chipidea: fix interrupt deadlock +- USB: iowarrior: fix control-message timeouts +- most: fix control-message timeouts +- serial: 8250: fix racy uartclk update +- USB: serial: keyspan: fix memleak on probe errors +- iio: ad5770r: make devicetree property reading consistent +- iio: dac: ad5446: Fix ad5622_write() return value +- coresight: cti: Correct the parameter for pm_runtime_put +- pinctrl: core: fix possible memory leak in pinctrl_enable() +- PCI: aardvark: Fix support for PCI_ROM_ADDRESS1 on emulated bridge +- PCI: aardvark: Set PCI Bridge Class Code to PCI Bridge +- PCI: aardvark: Fix support for PCI_BRIDGE_CTL_BUS_RESET on emulated bridge +- PCI: aardvark: Fix support for bus mastering and PCI_COMMAND on emulated bridge +- PCI: aardvark: Read all 16-bits from PCIE_MSI_PAYLOAD_REG +- PCI: aardvark: Fix return value of MSI domain .alloc() method +- PCI: aardvark: Fix configuring Reference clock +- PCI: aardvark: Fix reporting Data Link Layer Link Active +- PCI: aardvark: Do not unmask unused interrupts +- PCI: aardvark: Fix checking for link up via LTSSM state +- PCI: aardvark: Do not clear status bits of masked interrupts +- PCI: cadence: Add cdns_plat_pcie_probe() missing return +- PCI: pci-bridge-emul: Fix emulation of W1C bits +- xen/balloon: add late_initcall_sync() for initial ballooning done +- ALSA: mixer: fix deadlock in snd_mixer_oss_set_volume +- ALSA: mixer: oss: Fix racy access to slots +- ifb: fix building without CONFIG_NET_CLS_ACT +- serial: core: Fix initializing and restoring termios speed +- ring-buffer: Protect ring_buffer_reset() from reentrancy +- powerpc/85xx: Fix oops when mpc85xx_smp_guts_ids node cannot be found +- can: j1939: j1939_can_recv(): ignore messages with invalid source address +- can: j1939: j1939_tp_cmd_recv(): ignore abort message in the BAM transport +- KVM: nVMX: Query current VMCS when determining if MSR bitmaps are in use +- KVM: arm64: Extract ESR_ELx.EC only +- power: supply: max17042_battery: use VFSOC for capacity when no rsns +- power: supply: max17042_battery: Prevent int underflow in set_soc_threshold +- mtd: rawnand: socrates: Keep the driver compatible with on-die ECC engines +- soc: fsl: dpio: use the combined functions to protect critical zone +- soc: fsl: dpio: replace smp_processor_id with raw_smp_processor_id +- signal/mips: Update (_save|_restore)_fp_context to fail with -EFAULT +- memory: renesas-rpc-if: Correct QSPI data transfer in Manual mode +- signal: Remove the bogus sigkill_pending in ptrace_stop +- RDMA/qedr: Fix NULL deref for query_qp on the GSI QP +- perf/x86/intel/uncore: Fix Intel ICX IIO event constraints +- perf/x86/intel/uncore: Support extra IMC channel on Ice Lake server +- rsi: Fix module dev_oper_mode parameter description +- rsi: fix rate mask set leading to P2P failure +- rsi: fix key enabled check causing unwanted encryption for vap_id > 0 +- rsi: fix occasional initialisation failure with BT coex +- wcn36xx: handle connection loss indication +- libata: fix checking of DMA state +- mwifiex: Try waking the firmware until we get an interrupt +- mwifiex: Read a PCI register after writing the TX ring write pointer +- PM: sleep: Do not let "syscore" devices runtime-suspend during system transitions +- wcn36xx: Fix (QoS) null data frame bitrate/modulation +- wcn36xx: Fix tx_status mechanism +- wcn36xx: Fix HT40 capability for 2Ghz band +- ifb: Depend on netfilter alternatively to tc +- evm: mark evm_fixmode as __ro_after_init +- rtl8187: fix control-message timeouts +- PCI: Mark Atheros QCA6174 to avoid bus reset +- ath10k: fix division by zero in send path +- ath10k: fix control-message timeout +- ath6kl: fix control-message timeout +- ath6kl: fix division by zero in send path +- mwifiex: fix division by zero in fw download path +- EDAC/sb_edac: Fix top-of-high-memory value for Broadwell/Haswell +- regulator: dt-bindings: samsung,s5m8767: correct s5m8767,pmic-buck-default-dvs-idx property +- regulator: s5m8767: do not use reset value as DVS voltage if GPIO DVS is disabled +- hwmon: (pmbus/lm25066) Add offset coefficients +- selinux: fix race condition when computing ocontext SIDs +- ia64: kprobes: Fix to pass correct trampoline address to the handler +- KVM: VMX: Unregister posted interrupt wakeup handler on hardware unsetup +- btrfs: call btrfs_check_rw_degradable only if there is a missing device +- btrfs: fix lost error handling when replaying directory deletes +- btrfs: clear MISSING device status bit in btrfs_close_one_device +- rds: stop using dmapool +- net/smc: Correct spelling mistake to TCPF_SYN_RECV +- net/smc: Fix smc_link->llc_testlink_time overflow +- nfp: bpf: relax prog rejection for mtu check through max_pkt_offset +- vmxnet3: do not stop tx queues after netif_device_detach() +- r8169: Add device 10ec:8162 to driver r8169 +- nvmet-tcp: fix header digest verification +- block: schedule queue restart after BLK_STS_ZONE_RESOURCE +- drm: panel-orientation-quirks: Add quirk for GPD Win3 +- watchdog: Fix OMAP watchdog early handling +- net: multicast: calculate csum of looped-back and forwarded packets +- spi: spl022: fix Microwire full duplex mode +- nvmet-tcp: fix a memory leak when releasing a queue +- xen/netfront: stop tx queues during live migration +- gpio: mlxbf2.c: Add check for bgpio_init failure +- bpf: Prevent increasing bpf_jit_limit above max +- bpf: Define bpf_jit_alloc_exec_limit for arm64 JIT +- fcnal-test: kill hanging ping/nettest binaries on cleanup +- drm: panel-orientation-quirks: Add quirk for Aya Neo 2021 +- mmc: winbond: don't build on M68K +- reset: socfpga: add empty driver allowing consumers to probe +- ARM: dts: sun7i: A20-olinuxino-lime2: Fix ethernet phy-mode +- hyperv/vmbus: include linux/bitops.h +- sfc: Don't use netif_info before net_device setup +- sfc: Export fibre-specific supported link modes +- cavium: Fix return values of the probe function +- mISDN: Fix return values of the probe function +- scsi: qla2xxx: Fix unmap of already freed sgl +- scsi: qla2xxx: Return -ENOMEM if kzalloc() fails +- cavium: Return negative value when pci_alloc_irq_vectors() fails +- ALSA: hda/realtek: Fixes HP Spectre x360 15-eb1xxx speakers +- ASoC: soc-core: fix null-ptr-deref in snd_soc_del_component_unlocked() +- x86/irq: Ensure PI wakeup handler is unregistered before module unload +- x86/cpu: Fix migration safety with X86_BUG_NULL_SEL +- x86/sme: Use #define USE_EARLY_PGTABLE_L5 in mem_encrypt_identity.c +- fuse: fix page stealing +- ext4: fix lazy initialization next schedule time computation in more granular unit +- ALSA: timer: Unconditionally unlink slave instances, too +- ALSA: synth: missing check for possible NULL after the call to kstrdup +- ALSA: hda: Free card instance properly at probe errors +- ALSA: usb-audio: Add registration quirk for JBL Quantum 400 +- ALSA: usb-audio: Line6 HX-Stomp XL USB_ID for 48k-fixed quirk +- ALSA: line6: fix control and interrupt message timeouts +- ALSA: 6fire: fix control and bulk message timeouts +- ALSA: ua101: fix division by zero at probe +- ALSA: hda/realtek: Add quirk for HP EliteBook 840 G7 mute LED +- ALSA: hda/realtek: Add quirk for ASUS UX550VE +- ALSA: hda/realtek: Add a quirk for Acer Spin SP513-54N +- ALSA: hda/realtek: Headset fixup for Clevo NH77HJQ +- ALSA: hda/realtek: Add quirk for Clevo PC70HS +- ALSA: hda/realtek: Add a quirk for HP OMEN 15 mute LED +- ALSA: hda/realtek: Fix mic mute LED for the HP Spectre x360 14 +- media: v4l2-ioctl: Fix check_ext_ctrls +- media: ir-kbd-i2c: improve responsiveness of hauppauge zilog receivers +- media: rkvdec: Support dynamic resolution changes +- media: ite-cir: IR receiver stop working after receive overflow +- media: rkvdec: Do not override sizeimage for output format +- crypto: s5p-sss - Add error handling in s5p_aes_probe() +- firmware/psci: fix application of sizeof to pointer +- tpm: Check for integer overflow in tpm2_map_response_body() +- parisc: Fix ptrace check on syscall return +- parisc: Fix set_fixmap() on PA1.x CPUs +- exfat: fix incorrect loading of i_blocks for large files +- mmc: dw_mmc: Dont wait for DRTO on Write RSP error +- mmc: mtk-sd: Add wait dma stop done flow +- scsi: qla2xxx: Fix use after free in eh_abort path +- scsi: qla2xxx: Fix kernel crash when accessing port_speed sysfs file +- scsi: core: Remove command size deduction from scsi_setup_scsi_cmnd() +- ocfs2: fix data corruption on truncate +- libata: fix read log timeout value +- Input: i8042 - Add quirk for Fujitsu Lifebook T725 +- Input: elantench - fix misreporting trackpoint coordinates +- Input: iforce - fix control-message timeout +- binder: use cred instead of task for getsecid +- binder: use cred instead of task for selinux checks +- binder: use euid from cred instead of using task +- usb: xhci: Enable runtime-pm by default on AMD Yellow Carp platform +- xhci: Fix USB 3.1 enumeration issues by increasing roothub power-on-good delay + +* Mon Dec 06 2021 Zheng Zengkai - 5.10.0-24.0.0.15 +- kprobe : fix out-of-bounds in register_kretprobe when parsing negative data_size +- ima: Fix the pathname to relative path when get absolute path failed +- Revert "init: only move down lockup_detector_init() when +- pci: Enable acs for QLogic HBA cards +- config: enable SVA feature +- vfio/migration: bugfix queue isolation configuration +- acc/migration: bugfix Guest reset scene +- vfio/acc: Modify operation to get queues number +- crypto: hisilicon/qm - modify the uacce mode check +- crypto: hisilicon/zip - Fix spelling mistake "COMSUMED" -> "CONSUMED" +- crypto: hisilicon - Fix sscanf format signedness +- arm64/numa: cdm: Cacheline aligned cdmmask to improve performance +- ntp: Avoid undefined behaviour in second_overflow() +- arm64: kexec: only clear EOI for SDEI in NMI context +- iommu/iova: wait 'fq_timer' handler to finish before destroying 'fq' +- ilp32: fix compile problem when ARM64_ILP32 and UBSAN are both enabled +- acpi/arm64: check the returned logical CPU number of 'acpi_map_cpuid()' +- arm64: fix abi change caused by ILP32 +- arm64: cpufeature: add cmdline option for disable lse +- cache: Workaround HiSilicon Taishan DC CVAU +- signal: Export tracepoint symbol signal_generate +- suspend: export cpu_suspend/cpu_resume/psci_ops +- printk: export log_buf_addr_get/log_buf_len_get +- printk: Export a symbol. +- ACPI / APEI: Notify all ras err to driver +- Export sysboml for bbox to use. +- tty: fix possible deadlock in console_unlock +- printk: move printk_safe macros to printk header +- iommu: set the default iommu-dma mode as non-strict +- iommu/iova: avoid softlockup in fq_flush_timeout +- svm: Enable CONFIG_HISI_SVM by default +- svm: Add svm_get_phys to get phys addr for ts core +- svm: add set l2 cache read count functions +- svm: implement svm pin/unpin pages to forbid page migrtate +- svm: Add ioctl to get meminfo +- svm: implement the process remap features +- svm: implement the svm process load flag +- svm: add support for allocing memory which is within 4G physical address in svm_mmap +- svm: driver probe to read l2buff addr +- svm: Add and export svm_get_pasid +- svm: implement svm bind and unbind +- svm: using a rbtree to manage the svm_process +- svm: add svm bind ioctl and add some functions +- svm: init the children device of svm device +- svm: init the svm device and remove the svm device +- svm: add svm drv framework for ascend +- arm64/crypto: Accelerated CRC T10 DIF computation +- watchdog: Fix check_preemption_disabled() error +- ext4: stop IO for page without buffer_head +- driver: support ts core ras process +- imans: Check CAP_SYS_ADMIN in userns associated with IMA NS during configuration. +- stop_machine: mask pseudo nmi before running the callback +- stop_machine: mask sdei before running the callback +- hugetlb: before freeing hugetlb page set dtor to appropriate value + +* Mon Dec 06 2021 Zheng Zengkai - 5.10.0-23.0.0.14 +- memcg: unify memcg stat flushing +- memcg: flush stats only if updated +- blk-cgroup: blk_cgroup_bio_start() should use irq-safe operations on blkg->iostat_cpu +- memcg: flush lruvec stats in the refault +- mm, memcg: remove unused functions +- memcg: infrastructure to flush memcg stats +- memcg: switch lruvec stats to rstat +- mm: memcontrol: fix blocking rstat function called from atomic cgroup1 thresholding code +- cgroup: rstat: fix A-A deadlock on 32bit around u64_stats_sync +- kselftests: cgroup: update kmem test for new vmstat implementation +- mm: memcontrol: consolidate lruvec stat flushing +- mm: memcontrol: switch to rstat +- cgroup: rstat: punt root-level optimization to individual controllers +- cgroup: rstat: support cgroup1 +- mm: memcontrol: privatize memcg_page_state query functions +- mm: memcontrol: kill mem_cgroup_nodeinfo() +- mm: memcontrol: fix cpuhotplug statistics flushing +- hugetlbfs: flush TLBs correctly after huge_pmd_unshare +- rsi: fix control-message timeout +- media: staging/intel-ipu3: css: Fix wrong size comparison imgu_css_fw_init +- staging: rtl8192u: fix control-message timeouts +- staging: r8712u: fix control-message timeout +- comedi: vmk80xx: fix bulk and interrupt message timeouts +- comedi: vmk80xx: fix bulk-buffer overflow +- comedi: vmk80xx: fix transfer-buffer overflows +- comedi: ni_usb6501: fix NULL-deref in command paths +- comedi: dt9812: fix DMA buffers on stack +- isofs: Fix out of bound access for corrupted isofs image +- staging: rtl8712: fix use-after-free in rtl8712_dl_fw +- printk/console: Allow to disable console output by using console="" or console=null +- binder: don't detect sender/target during buffer cleanup +- usb-storage: Add compatibility quirk flags for iODD 2531/2541 +- usb: musb: Balance list entry in musb_gadget_queue +- usb: gadget: Mark USB_FSL_QE broken on 64-bit +- usb: ehci: handshake CMD_RUN instead of STS_HALT +- Revert "x86/kvm: fix vcpu-id indexed array sizes" +- KVM: x86: avoid warning with -Wbitwise-instead-of-logical +- ovl: warn about orphan metacopy +- ext4: fix e2fsprogs checksum failure for mounted filesystem +- ima: Fix warning: no previous prototype for function 'ima_add_kexec_buffer' +- kfence: default to dynamic branch instead of static keys mode +- kfence: always use static branches to guard kfence_alloc() +- kfence: shorten critical sections of alloc/free +- kfence: add note to documentation about skipping covered allocations +- kfence: limit currently covered allocations when pool nearly full +- kfence: move saving stack trace of allocations into __kfence_alloc() +- kfence: count unexpectedly skipped allocations +- stacktrace: move filter_irq_stacks() to kernel/stacktrace.c +- powerpc: Don't provide __kernel_map_pages() without ARCH_SUPPORTS_DEBUG_PAGEALLOC +- powerpc/booke: Disable STRICT_KERNEL_RWX, DEBUG_PAGEALLOC and KFENCE +- bpf: Fix toctou on read-only map's constant scalar tracking +- block: avoid quiesce while elevator init +- mwifiex_usb: Fix skb_over_panic in mwifiex_usb_recv +- bonding: Fix a use-after-free problem when bond_sysfs_slave_add() failed +- drm/nouveau: clean up all clients on device removal +- drm/nouveau: Add a dedicated mutex for the clients list +- drm/nouveau: use drm_dev_unplug() during device removal +- locks: Fix UBSAN undefined behaviour in flock64_to_posix_lock +- livepatch/arm: fix incorrect stack detection +- sched/rt: Try to restart rt period timer when rt runtime exceeded +- blkcg: Remove extra blkcg_bio_issue_init +- ubifs: read-only if LEB may always be taken in ubifs_garbage_collect +- ubifs: fix double return leb in ubifs_garbage_collect +- ubifs: fix slab-out-of-bounds in ubifs_change_lp + +* Tue Nov 30 2021 Zheng Zengkai - 5.10.0-22.0.0.13 +- printk: enable zap_locks on X86 and ARM64 +- printk: fix potential deadlock in printk() +- printk/panic: prevent spin waiting in printk() +- panic/printk: fix zap_lock +- printk/panic: Avoid deadlock in printk() +- lib/clear_user: ensure loop in __arch_clear_user cache-aligned v2 +- mm/cdm: enable CONFIG_COHERENT_DEVICE in openeuler_defconfig +- mm: Be allowed to alloc CDM node memory for MPOL_BIND +- mm: Add DDR and HBM to nodes by cmdline +- mm: Change mbind(MPOL_BIND) implementation for CDM nodes +- mm: Ignore cpuset enforcement when allocation flag has __GFP_THISNODE +- mm: Ignore madvise(MADV_MERGEABLE) request for VM_CDM marked VMAs +- mm: Exclude CDM marked VMAs from auto NUMA +- mm: Exclude CDM nodes from task->mems_allowed and root cpuset +- mm: Tag VMA with VM_CDM flag explicitly during mbind(MPOL_BIND) and page fault +- mm: Enable Buddy allocation isolation for CDM nodes +- mm: Change generic FALLBACK zonelist creation process +- mm: Define coherent device memory (CDM) node +- fs/dcache.c: avoid softlock since too many negative dentry +- fs/dcache.c: avoid panic while lockref of dentry overflow +- ACPI/MPAM: Use acpi_map_pxm_to_node() to get node id for memory node +- arm64/mpam: Fix use-after-free in mkdir_resctrl_prepare() +- mm/page_cache_limit: add support for droping caches for target node +- mm/page_cache_limit: do shrink_page_cache when adding page to page cache +- mm/page_cache_limit: reconfiguration about page cache limit when memory plug/unplug +- mm/page_cache_limit: shrink page cache +- mm/page_cache_limit: calculate reclaim pages for each node +- mm/page_cache_limit: create kernel thread for page cache limit +- mm/page_cache_limit: add pagecache limit proc interface +- openeuler_defconfig: Enable some Icelake support configs +- timer_list: avoid other cpu soft lockup when printing timer list + +* Fri Nov 26 2021 Zheng Zengkai - 5.10.0-21.0.0.12 +- gpio: gpio-hisi: Add HiSilicon GPIO support +- hugetlbfs: avoid overflow in hugetlbfs_fallocate +- config: Open CONFIG_CORELOCKUP_DETECTOR +- watchdog/corelockup: Depends on the hardlockup detection switch +- watchdog/corelockup: Add interface to control the detection sensitivity. +- watchdog/corelockup: Optimized core lockup detection judgment rules +- corelockup: Add detector enable support by cmdline +- corelockup: Disable wfi/wfe mode for pmu based nmi +- corelockup: Add support of cpu core hang check +- KVM: arm64: vgic-its: Flush pending LPIs when nuking DT +- KVM: arm64: Mark the page dirty only if the fault is handled successfully +- KVM: arm64: Filter out the case of only changing permissions from stage-2 map path +- KVM: arm64: Adjust partial code of hyp stage-1 map and guest stage-2 map +- KVM: arm64: Add support for probing Hisi ncsnp capability +- KVM: arm64: Probe Hisi CPU TYPE from ACPI/DTB +- perf, kvm/arm64: perf-kvm-stat to report VM TRAP +- perf, kvm/arm64: Add stat support on arm64 +- KVM: arm64: Adjust entry/exit and trap related tracepoints +- openeuler_defconfig: Build HiSilicon I2C/SPI/SFC driver as module +- kvm: arm/arm64: add irqsave for lpi_cache_lock +- KVM: arm/arm64: vgic-its: Do not execute invalidate MSI-LPI translation cache on movi command +- KVM: arm/arm64: vgic-its: Introduce multiple LPI translation caches +- net:spnic:Clear the flag of CSUM and TSO when VXLAN is not supported +- net:spnic:Support to configure DMA atrribute thru firmware. +- net:spnic: Add the get_rxfh_indir_size in ethtool_ops structure. +- iscsi: use dynamic single thread workqueue to improve performance +- workqueue: implement NUMA affinity for single thread workqueue +- iscsi: add member for NUMA aware order workqueue +- livepatch: Fix crash when access the global variable in hook +- jump_label: skip resource release if jump label is not relocated +- SCSI: spfc: fix typo of last_cmsn + +* Tue Nov 23 2021 Zheng Zengkai - 5.10.0-20.0.0.11 +- atlantic: Fix OOB read and write in hw_atl_utils_fw_rpc_wait + +* Thu Nov 18 2021 Zheng Zengkai - 5.10.0-19.0.0.10 +- net: hns3: allow configure ETS bandwidth of all TCs +- net: hns3: remove check VF uc mac exist when set by PF +- net: hns3: fix some mac statistics is always 0 in device version V2 +- net: hns3: fix kernel crash when unload VF while it is being reset +- net: hns3: sync rx ring head in echo common pull +- net: hns3: fix pfc packet number incorrect after querying pfc parameters +- net: hns3: fix ROCE base interrupt vector initialization bug +- net: hns3: fix failed to add reuse multicast mac addr to hardware when mc mac table is full +- net: hisilicon: fix hsn3_ethtool kernel-doc warnings +- net: hns3: adjust string spaces of some parameters of tx bd info in debugfs +- net: hns3: expand buffer len for some debugfs command +- net: hns3: add more string spaces for dumping packets number of queue info in debugfs +- net: hns3: fix data endian problem of some functions of debugfs +- net: hns3: ignore reset event before initialization process is done +- net: hns3: change hclge/hclgevf workqueue to WQ_UNBOUND mode +- net: hns3: add error recovery module and type for himac +- net: hns3: add new ras error type for roce +- net: hns3: add update ethtool advertised link modes for FIBRE port when autoneg off +- net: hns3: modify functions of converting speed ability to ethtool link mode +- net: hns3: add support pause/pfc durations for mac statistics +- net: hns3: device specifications add number of mac statistics +- net: hns3: modify mac statistics update process for compatibility +- net: hns3: add debugfs support for interrupt coalesce +- net: hns3: schedule the polling again when allocation fails +- net: hns3: fix for miscalculation of rx unused desc +- net: hns3: Add configuration of TM QCN error event +- net: hns3: use dev_driver_string() instead of pci_dev->driver->name +- net: hns3: debugfs add support dumping page pool info +- net: hns3: disable firmware compatible features when uninstall PF +- net: hns3: PF enable promisc for VF when mac table is overflow +- net: hns3: don't rollback when destroy mqprio fail +- net: hns3: remove tc enable checking +- net: hns3: fix hclge_dbg_dump_tm_pg() stack usage +- net: hns3: PF support get multicast MAC address space assigned by firmware +- net: hns3: PF support get unicast MAC address space assigned by firmware +- mm/damon: remove return value from before_terminate callback +- mm/damon: fix a few spelling mistakes in comments and a pr_debug message +- Docs/admin-guide/mm/pagemap: wordsmith page flags descriptions +- Docs/admin-guide/mm/damon/start: simplify the content +- Docs/admin-guide/mm/damon/start: fix a wrong link +- Docs/admin-guide/mm/damon/start: fix wrong example commands +- mm/damon: simplify stop mechanism +- mm/damon/dbgfs: add adaptive_targets list check before enable monitor_on +- mm/damon: remove unnecessary variable initialization +- Documentation/admin-guide/mm/damon: add a document for DAMON_RECLAIM +- mm/damon: introduce DAMON-based Reclamation (DAMON_RECLAIM) +- selftests/damon: support watermarks +- mm/damon/dbgfs: support watermarks +- mm/damon/schemes: activate schemes based on a watermarks mechanism +- tools/selftests/damon: update for regions prioritization of schemes +- mm/damon/dbgfs: support prioritization weights +- mm/damon/vaddr,paddr: support pageout prioritization +- mm/damon/schemes: prioritize regions within the quotas +- mm/damon/selftests: support schemes quotas +- mm/damon/dbgfs: support quotas of schemes +- mm/damon/schemes: implement time quota +- mm/damon/schemes: skip already charged targets and regions +- mm/damon/schemes: implement size quota for schemes application speed control +- mm/damon/paddr: support the pageout scheme +- mm/damon/dbgfs: remove unnecessary variables +- mm/damon/vaddr: constify static mm_walk_ops +- Docs/DAMON: document physical memory monitoring support +- mm/damon/dbgfs: support physical memory monitoring +- mm/damon: implement primitives for physical address space monitoring +- mm/damon/vaddr: separate commonly usable functions +- Docs/admin-guide/mm/damon: document 'init_regions' feature +- mm/damon/dbgfs-test: add a unit test case for 'init_regions' +- mm/damon/dbgfs: allow users to set initial monitoring target regions +- Docs/admin-guide/mm/damon: document DAMON-based Operation Schemes +- selftests/damon: add 'schemes' debugfs tests +- mm/damon/schemes: implement statistics feature +- mm/damon/dbgfs: support DAMON-based Operation Schemes +- mm/damon/vaddr: support DAMON-based Operation Schemes +- mm/damon/core: implement DAMON-based Operation Schemes (DAMOS) +- mm/damon/core: account age of target regions +- mm/damon/core: nullify pointer ctx->kdamond with a NULL +- mm/damon: needn't hold kdamond_lock to print pid of kdamond +- mm/damon: remove unnecessary do_exit() from kdamond +- mm/damon/core: print kdamond start log in debug mode only +- include/linux/damon.h: fix kernel-doc comments for 'damon_callback' +- docs/vm/damon: remove broken reference +- MAINTAINERS: update SeongJae's email address +- Documentation/vm: move user guides to admin-guide/mm/ +- mm/damon: grammar s/works/work/ +- mm/damon/core-test: fix wrong expectations for 'damon_split_regions_of()' +- mm/damon: don't use strnlen() with known-bogus source length +- sched: Add cluster scheduler level in core and related Kconfig for ARM64 +- topology: Represent clusters of CPUs within a die + +* Tue Nov 16 2021 sdlzx - 5.10.0-19.0.0.9 +- remove unused linux-kernel-test.patch + +* Mon Nov 15 2021 Zheng Zengkai - 5.10.0-18.0.0.8 +- net: phy: fix duplex out of sync problem while changing settings +- ARM: use ldr_l to replace ldr instruction for the symbol jump +- squashfs: provides backing_dev_info in order to disable read-ahead +- nbd_genl_status: null check for nla_nest_start +- Bluetooth: sco: Fix lock_sock() blockage by memcpy_from_msg() +- Bluetooth: switch to lock_sock in SCO +- ubi: fix slab-out-of-bounds in ubi_eba_get_ldesc+0xfb/0x130 +- bpf, cgroup: Assign cgroup in cgroup_sk_alloc when called from interrupt +- bpf, cgroups: Fix cgroup v2 fallback on v1/v2 mixed mode +- scsi: make sure that request queue queiesce and unquiesce balanced +- scsi: avoid to quiesce sdev->request_queue two times +- dm: don't stop request queue after the dm device is suspended +- blk-mq: support concurrent queue quiesce/unquiesce +- nvme: loop: clear NVME_CTRL_ADMIN_Q_STOPPED after admin queue is reallocated +- nvme: paring quiesce/unquiesce +- nvme: prepare for pairing quiescing and unquiescing +- nvme: apply nvme API to quiesce/unquiesce admin queue +- nvme: add APIs for stopping/starting admin queue +- ARM: 9057/1: cache-v7: add missing ISB after cache level selection +- blk-mq: don't free tags if the tag_set is used by other device in queue initialztion +- ALSA: usb-audio: Add Audient iD14 to mixer map quirk table +- ALSA: usb-audio: Add Schiit Hel device to mixer map quirk table +- Revert "wcn36xx: Disable bmps when encryption is disabled" +- ARM: 9120/1: Revert "amba: make use of -1 IRQs warn" +- Revert "drm/ttm: fix memleak in ttm_transfered_destroy" +- mm: khugepaged: skip huge page collapse for special files +- Revert "usb: core: hcd: Add support for deferring roothub registration" +- Revert "xhci: Set HCD flag to defer primary roothub registration" +- net: ethernet: microchip: lan743x: Fix skb allocation failure +- vrf: Revert "Reset skb conntrack connection..." +- sfc: Fix reading non-legacy supported link modes +- Revert "io_uring: reinforce cancel on flush during exit" +- scsi: core: Put LLD module refcnt after SCSI device is released +- iio: buffer: Return error if no callback is given +- iio: core: Allow drivers to specify a label without it coming from of +- regulator: core: Respect off_on_delay at startup +- regulator: core: do not continue if selector match +- ubi: fix race condition between ctrl_cdev_ioctl and ubi_cdev_ioctl +- Revert "[Backport] arm64: mm: account for hotplug memory when randomizing the linear region" +- ubi: fastmap: Add all fastmap pebs into 'ai->fastmap' when fm->used_blocks>=2 +- ubi: fastmap: Return error code if memory allocation fails in add_aeb() +- ubifs: Fix to add refcount once page is set private +- ubifs: Fix read out-of-bounds in ubifs_wbuf_write_nolock() +- ubifs: setflags: Make dirtied_ino_d 8 bytes aligned +- ubifs: Rectify space amount budget for mkdir/tmpfile operations +- ubifs: Fix 'ui->dirty' race between do_tmpfile() and writeback work +- ubifs: Rename whiteout atomically +- ubifs: Add missing iput if do_tmpfile() failed in rename whiteout +- ubifs: Fix wrong number of inodes locked by ui_mutex in ubifs_inode comment +- ubifs: Fix deadlock in concurrent rename whiteout and inode writeback +- ubifs: rename_whiteout: Fix double free for whiteout_ui->data +- blk-cgroup: fix missing put device in error path from blkg_conf_pref() +- blk-cgroup: synchronize blkg creation against policy deactivation +- perf script: Check session->header.env.arch before using it +- riscv: Fix asan-stack clang build +- riscv: fix misalgned trap vector base address +- scsi: ufs: ufs-exynos: Correct timeout value setting registers +- KVM: s390: preserve deliverable_mask in __airqs_kick_single_vcpu +- KVM: s390: clear kicked_mask before sleeping again +- lan743x: fix endianness when accessing descriptors +- phy: phy_ethtool_ksettings_set: Lock the PHY while changing settings +- phy: phy_start_aneg: Add an unlocked version +- phy: phy_ethtool_ksettings_set: Move after phy_start_aneg +- phy: phy_ethtool_ksettings_get: Lock the phy for consistency +- net/tls: Fix flipped sign in async_wait.err assignment +- net: nxp: lpc_eth.c: avoid hang when bringing interface down +- net: ethernet: microchip: lan743x: Fix dma allocation failure by using dma_set_mask_and_coherent +- net: ethernet: microchip: lan743x: Fix driver crash when lan743x_pm_resume fails +- mlxsw: pci: Recycle received packet upon allocation failure +- nios2: Make NIOS2_DTB_SOURCE_BOOL depend on !COMPILE_TEST +- gpio: xgs-iproc: fix parsing of ngpios property +- RDMA/sa_query: Use strscpy_pad instead of memcpy to copy a string +- net: Prevent infinite while loop in skb_tx_hash() +- cfg80211: correct bridge/4addr mode check +- net-sysfs: initialize uid and gid before calling net_ns_get_ownership +- net: batman-adv: fix error handling +- regmap: Fix possible double-free in regcache_rbtree_exit() +- reset: brcmstb-rescal: fix incorrect polarity of status bit +- arm64: dts: allwinner: h5: NanoPI Neo 2: Fix ethernet node +- RDMA/mlx5: Set user priority for DCT +- octeontx2-af: Display all enabled PF VF rsrc_alloc entries. +- nvme-tcp: fix possible req->offset corruption +- nvme-tcp: fix data digest pointer calculation +- nvmet-tcp: fix data digest pointer calculation +- IB/hfi1: Fix abba locking issue with sc_disable() +- IB/qib: Protect from buffer overflow in struct qib_user_sdma_pkt fields +- bpf: Fix error usage of map_fd and fdget() in generic_map_update_batch() +- bpf: Fix potential race in tail call compatibility check +- tcp_bpf: Fix one concurrency problem in the tcp_bpf_send_verdict function +- riscv, bpf: Fix potential NULL dereference +- drm/ttm: fix memleak in ttm_transfered_destroy +- mm, thp: bail out early in collapse_file for writeback page +- net: lan78xx: fix division by zero in send path +- cfg80211: fix management registrations locking +- cfg80211: scan: fix RCU in cfg80211_add_nontrans_list() +- nvme-tcp: fix H2CData PDU send accounting (again) +- ocfs2: fix race between searching chunks and release journal_head from buffer_head +- mmc: sdhci-esdhc-imx: clear the buffer_read_ready to reset standard tuning circuit +- mmc: sdhci: Map more voltage level to SDHCI_POWER_330 +- mmc: dw_mmc: exynos: fix the finding clock sample value +- mmc: mediatek: Move cqhci init behind ungate clock +- mmc: cqhci: clear HALT state after CQE enable +- mmc: vub300: fix control-message timeouts +- net/tls: Fix flipped sign in tls_err_abort() calls +- Revert "net: mdiobus: Fix memory leak in __mdiobus_register" +- nfc: port100: fix using -ERRNO as command type mask +- tipc: fix size validations for the MSG_CRYPTO type +- ata: sata_mv: Fix the error handling of mv_chip_id() +- pinctrl: amd: disable and mask interrupts on probe +- Revert "pinctrl: bcm: ns: support updated DT binding as syscon subnode" +- usbnet: fix error return code in usbnet_probe() +- usbnet: sanity check for maxpacket +- powerpc/bpf: Fix BPF_MOD when imm == 1 +- ARM: 9141/1: only warn about XIP address when not compile testing +- ARM: 9139/1: kprobes: fix arch_init_kprobes() prototype +- ARM: 9138/1: fix link warning with XIP + frame-pointer +- ARM: 9134/1: remove duplicate memcpy() definition +- ARM: 9133/1: mm: proc-macros: ensure *_tlb_fns are 4B aligned +- ARM: 9132/1: Fix __get_user_check failure with ARM KASAN images +- ALSA: timer: Fix use-after-free problem +- io_uring: don't take uring_lock during iowq cancel +- io_uring: deduplicate failing task_work_add +- nbd: add sanity check for first_minor +- bpf: Add ambient BPF runtime context stored in current +- net: make free_netdev() more lenient with unregistering devices +- ovl: fix use after free in struct ovl_aio_req +- ext4: if zeroout fails fall back to splitting the extent node +- loop: Select I/O scheduler 'none' from inside add_disk() +- blk-mq: Introduce the BLK_MQ_F_NO_SCHED_BY_DEFAULT flag +- Revert "[Huawei] block: stop wait rcu once we can ensure no io while elevator init" +- ext4: refresh the ext4_ext_path struct after dropping i_data_sem. +- ext4: ensure enough credits in ext4_ext_shift_path_extents +- block, bfq: fix UAF problem in bfqg_stats_init() +- ARM: 9098/1: ftrace: MODULE_PLT: Fix build problem without DYNAMIC_FTRACE +- ARM: 9079/1: ftrace: Add MODULE_PLTS support +- ARM: 9078/1: Add warn suppress parameter to arm_gen_branch_link() +- ARM: 9077/1: PLT: Move struct plt_entries definition to header +- sctp: add vtag check in sctp_sf_ootb +- sctp: add vtag check in sctp_sf_do_8_5_1_E_sa +- sctp: add vtag check in sctp_sf_violation +- sctp: fix the processing for COOKIE_ECHO chunk +- sctp: fix the processing for INIT_ACK chunk +- sctp: fix the processing for INIT chunk +- sctp: use init_tag from inithdr for ABORT chunk +- Bluetooth: fix use-after-free error in lock_sock_nested() +- loop: fix loop_validate_block_size() can't make sense +- Fix NULL pointer dereference in handling for passthrough commands +- nbd: Fix use-after-free in pid_show +- PM: hibernate: Get block device exclusively in swsusp_check() +- scsi: scsi_debug: Fix out-of-bound read in resp_report_tgtpgs() +- scsi: scsi_debug: Fix out-of-bound read in resp_readcap16() +- ext4: check magic even the extent block bh is verified +- ext4: avoid recheck extent for EXT4_EX_FORCE_CACHE +- pinctrl: stm32: use valid pin identifier in stm32_pinctrl_resume() +- ARM: 9122/1: select HAVE_FUTEX_CMPXCHG +- selftests: bpf: fix backported ASSERT_FALSE +- e1000e: Separate TGP board type from SPT +- tracing: Have all levels of checks prevent recursion +- net: mdiobus: Fix memory leak in __mdiobus_register +- bpf, test, cgroup: Use sk_{alloc,free} for test cases +- s390/pci: fix zpci_zdev_put() on reserve +- can: isotp: isotp_sendmsg(): fix TX buffer concurrent access in isotp_sendmsg() +- scsi: core: Fix shost->cmd_per_lun calculation in scsi_add_host_with_dma() +- sched/scs: Reset the shadow stack when idle_task_exit +- scsi: qla2xxx: Fix a memory leak in an error path of qla2x00_process_els() +- scsi: iscsi: Fix set_param() handling +- Input: snvs_pwrkey - add clk handling +- perf/x86/msr: Add Sapphire Rapids CPU support +- libperf tests: Fix test_stat_cpu +- ALSA: hda: avoid write to STATESTS if controller is in reset +- platform/x86: intel_scu_ipc: Update timeout value in comment +- isdn: mISDN: Fix sleeping function called from invalid context +- ARM: dts: spear3xx: Fix gmac node +- net: stmmac: add support for dwmac 3.40a +- btrfs: deal with errors when checking if a dir entry exists during log replay +- ALSA: hda: intel: Allow repeatedly probing on codec configuration errors +- gcc-plugins/structleak: add makefile var for disabling structleak +- net: hns3: fix the max tx size according to user manual +- drm: mxsfb: Fix NULL pointer dereference crash on unload +- net: bridge: mcast: use multicast_membership_interval for IGMPv3 +- selftests: netfilter: remove stray bash debug line +- netfilter: Kconfig: use 'default y' instead of 'm' for bool config option +- isdn: cpai: check ctr->cnr to avoid array index out of bound +- nfc: nci: fix the UAF of rf_conn_info object +- KVM: nVMX: promptly process interrupts delivered while in guest mode +- mm, slub: fix incorrect memcg slab count for bulk free +- mm, slub: fix potential memoryleak in kmem_cache_open() +- mm, slub: fix mismatch between reconstructed freelist depth and cnt +- powerpc/idle: Don't corrupt back chain when going idle +- KVM: PPC: Book3S HV: Make idle_kvm_start_guest() return 0 if it went to guest +- KVM: PPC: Book3S HV: Fix stack handling in idle_kvm_start_guest() +- powerpc64/idle: Fix SP offsets when saving GPRs +- net: dsa: mt7530: correct ds->num_ports +- audit: fix possible null-pointer dereference in audit_filter_rules +- ASoC: DAPM: Fix missing kctl change notifications +- ALSA: hda/realtek: Add quirk for Clevo PC50HS +- ALSA: usb-audio: Provide quirk for Sennheiser GSP670 Headset +- vfs: check fd has read access in kernel_read_file_from_fd() +- elfcore: correct reference to CONFIG_UML +- userfaultfd: fix a race between writeprotect and exit_mmap() +- ocfs2: mount fails with buffer overflow in strlen +- ocfs2: fix data corruption after conversion from inline format +- ceph: fix handling of "meta" errors +- ceph: skip existing superblocks that are blocklisted or shut down when mounting +- can: j1939: j1939_xtp_rx_rts_session_new(): abort TP less than 9 bytes +- can: j1939: j1939_xtp_rx_dat_one(): cancel session if receive TP.DT with error length +- can: j1939: j1939_netdev_start(): fix UAF for rx_kref of j1939_priv +- can: j1939: j1939_tp_rxtimer(): fix errant alert in j1939_tp_rxtimer +- can: isotp: isotp_sendmsg(): add result check for wait_event_interruptible() +- can: isotp: isotp_sendmsg(): fix return error on FC timeout on TX path +- can: peak_pci: peak_pci_remove(): fix UAF +- can: peak_usb: pcan_usb_fd_decode_status(): fix back to ERROR_ACTIVE state notification +- can: rcar_can: fix suspend/resume +- net: enetc: fix ethtool counter name for PM0_TERR +- drm/panel: ilitek-ili9881c: Fix sync for Feixin K101-IM2BYL02 panel +- ice: Add missing E810 device ids +- e1000e: Fix packet loss on Tiger Lake and later +- net: stmmac: Fix E2E delay mechanism +- net: hns3: disable sriov before unload hclge layer +- net: hns3: fix vf reset workqueue cannot exit +- net: hns3: add limit ets dwrr bandwidth cannot be 0 +- net: hns3: reset DWRR of unused tc to zero +- powerpc/smp: do not decrement idle task preempt count in CPU offline +- NIOS2: irqflags: rename a redefined register name +- net: dsa: lantiq_gswip: fix register definition +- ipv6: When forwarding count rx stats on the orig netdev +- tcp: md5: Fix overlap between vrf and non-vrf keys +- lan78xx: select CRC32 +- netfilter: ipvs: make global sysctl readonly in non-init netns +- netfilter: ip6t_rt: fix rt0_hdr parsing in rt_mt6 +- ice: fix getting UDP tunnel entry +- ASoC: wm8960: Fix clock configuration on slave mode +- dma-debug: fix sg checks in debug_dma_map_sg() +- netfilter: xt_IDLETIMER: fix panic that occurs when timer_type has garbage value +- NFSD: Keep existing listeners on portlist error +- xtensa: xtfpga: Try software restart before simulating CPU reset +- xtensa: xtfpga: use CONFIG_USE_OF instead of CONFIG_OF +- drm/amdgpu/display: fix dependencies for DRM_AMD_DC_SI +- xen/x86: prevent PVH type from getting clobbered +- block: decode QUEUE_FLAG_HCTX_ACTIVE in debugfs output +- ARM: dts: at91: sama5d2_som1_ek: disable ISC node by default +- arm: dts: vexpress-v2p-ca9: Fix the SMB unit-address +- io_uring: fix splice_fd_in checks backport typo +- xhci: add quirk for host controllers that don't update endpoint DCS +- parisc: math-emu: Fix fall-through warnings +- net: dsa: mv88e6xxx: don't use PHY_DETECT on internal PHY's +- ionic: don't remove netdev->dev_addr when syncing uc list +- net: mscc: ocelot: warn when a PTP IRQ is raised for an unknown skb +- nfp: flow_offload: move flow_indr_dev_register from app init to app start +- r8152: select CRC32 and CRYPTO/CRYPTO_HASH/CRYPTO_SHA256 +- qed: Fix missing error code in qed_slowpath_start() +- mqprio: Correct stats in mqprio_dump_class_stats(). +- platform/x86: intel_scu_ipc: Fix busy loop expiry time +- acpi/arm64: fix next_platform_timer() section mismatch error +- drm/msm/dsi: fix off by one in dsi_bus_clk_enable error handling +- drm/msm/dsi: Fix an error code in msm_dsi_modeset_init() +- drm/msm/a6xx: Track current ctx by seqno +- drm/msm/mdp5: fix cursor-related warnings +- drm/msm: Fix null pointer dereference on pointer edp +- drm/edid: In connector_bad_edid() cap num_of_ext by num_blocks read +- drm/panel: olimex-lcd-olinuxino: select CRC32 +- spi: bcm-qspi: clear MSPI spifie interrupt during probe +- platform/mellanox: mlxreg-io: Fix read access of n-bytes size attributes +- platform/mellanox: mlxreg-io: Fix argument base in kstrtou32() call +- mlxsw: thermal: Fix out-of-bounds memory accesses +- ata: ahci_platform: fix null-ptr-deref in ahci_platform_enable_regulators() +- pata_legacy: fix a couple uninitialized variable bugs +- NFC: digital: fix possible memory leak in digital_in_send_sdd_req() +- NFC: digital: fix possible memory leak in digital_tg_listen_mdaa() +- nfc: fix error handling of nfc_proto_register() +- vhost-vdpa: Fix the wrong input in config_cb +- ethernet: s2io: fix setting mac address during resume +- net: encx24j600: check error in devm_regmap_init_encx24j600 +- net: dsa: microchip: Added the condition for scheduling ksz_mib_read_work +- net: stmmac: fix get_hw_feature() on old hardware +- net/mlx5e: Mutually exclude RX-FCS and RX-port-timestamp +- net/mlx5e: Fix memory leak in mlx5_core_destroy_cq() error path +- net: korina: select CRC32 +- net: arc: select CRC32 +- gpio: pca953x: Improve bias setting +- sctp: account stream padding length for reconf chunk +- nvme-pci: Fix abort command id +- ARM: dts: bcm2711-rpi-4-b: Fix pcie0's unit address formatting +- ARM: dts: bcm2711-rpi-4-b: fix sd_io_1v8_reg regulator states +- ARM: dts: bcm2711: fix MDIO #address- and #size-cells +- ARM: dts: bcm2711-rpi-4-b: Fix usb's unit address +- tee: optee: Fix missing devices unregister during optee_remove +- iio: dac: ti-dac5571: fix an error code in probe() +- iio: ssp_sensors: fix error code in ssp_print_mcu_debug() +- iio: ssp_sensors: add more range checking in ssp_parse_dataframe() +- iio: adc: max1027: Fix the number of max1X31 channels +- iio: light: opt3001: Fixed timeout error when 0 lux +- iio: mtk-auxadc: fix case IIO_CHAN_INFO_PROCESSED +- iio: adc: max1027: Fix wrong shift with 12-bit devices +- iio: adc128s052: Fix the error handling path of 'adc128_probe()' +- iio: adc: ad7793: Fix IRQ flag +- iio: adc: ad7780: Fix IRQ flag +- iio: adc: ad7192: Add IRQ flag +- driver core: Reject pointless SYNC_STATE_ONLY device links +- drivers: bus: simple-pm-bus: Add support for probing simple bus only devices +- iio: adc: aspeed: set driver data when adc probe. +- powerpc/xive: Discard disabled interrupts in get_irqchip_state() +- x86/Kconfig: Do not enable AMD_MEM_ENCRYPT_ACTIVE_BY_DEFAULT automatically +- nvmem: Fix shift-out-of-bound (UBSAN) with byte size cells +- EDAC/armada-xp: Fix output of uncorrectable error counter +- virtio: write back F_VERSION_1 before validate +- misc: fastrpc: Add missing lock before accessing find_vma() +- USB: serial: option: add prod. id for Quectel EG91 +- USB: serial: option: add Telit LE910Cx composition 0x1204 +- USB: serial: option: add Quectel EC200S-CN module support +- USB: serial: qcserial: add EM9191 QDL support +- Input: xpad - add support for another USB ID of Nacon GC-100 +- usb: musb: dsps: Fix the probe error path +- efi/cper: use stack buffer for error record decoding +- cb710: avoid NULL pointer subtraction +- xhci: Enable trust tx length quirk for Fresco FL11 USB controller +- xhci: Fix command ring pointer corruption while aborting a command +- xhci: guard accesses to ep_state in xhci_endpoint_reset() +- USB: xhci: dbc: fix tty registration race +- mei: me: add Ice Lake-N device id. +- x86/resctrl: Free the ctrlval arrays when domain_setup_mon_state() fails +- btrfs: fix abort logic in btrfs_replace_file_extents +- btrfs: update refs for any root except tree log roots +- btrfs: check for error when looking up inode during dir entry replay +- btrfs: deal with errors when adding inode reference during log replay +- btrfs: deal with errors when replaying dir entry during log replay +- btrfs: unlock newly allocated extent buffer after error +- drm/msm: Avoid potential overflow in timeout_to_jiffies() +- arm64/hugetlb: fix CMA gigantic page order for non-4K PAGE_SIZE +- csky: Fixup regs.sr broken in ptrace +- csky: don't let sigreturn play with priveleged bits of status register +- clk: socfpga: agilex: fix duplicate s2f_user0_clk +- s390: fix strrchr() implementation +- nds32/ftrace: Fix Error: invalid operands (*UND* and *UND* sections) for `^' +- ALSA: hda/realtek: Fix the mic type detection issue for ASUS G551JW +- ALSA: hda/realtek: Fix for quirk to enable speaker output on the Lenovo 13s Gen2 +- ALSA: hda/realtek: Add quirk for TongFang PHxTxX1 +- ALSA: hda/realtek - ALC236 headset MIC recording issue +- ALSA: hda/realtek: Add quirk for Clevo X170KM-G +- ALSA: hda/realtek: Complete partial device name to avoid ambiguity +- ALSA: hda - Enable headphone mic on Dell Latitude laptops with ALC3254 +- ALSA: hda/realtek: Enable 4-speaker output for Dell Precision 5560 laptop +- ALSA: seq: Fix a potential UAF by wrong private_free call order +- ALSA: pcm: Workaround for a wrong offset in SYNC_PTR compat ioctl +- ALSA: usb-audio: Add quirk for VF0770 +- hwmon: (pmbus/ibm-cffps) max_power_out swap changes +- sched: Always inline is_percpu_thread() +- perf/core: fix userpage->time_enabled of inactive events +- scsi: virtio_scsi: Fix spelling mistake "Unsupport" -> "Unsupported" +- scsi: ses: Fix unsigned comparison with less than zero +- drm/amdgpu: fix gart.bo pin_count leak +- net: sun: SUNVNET_COMMON should depend on INET +- vboxfs: fix broken legacy mount signature checking +- mac80211: check return value of rhashtable_init +- net: prevent user from passing illegal stab size +- hwmon: (ltc2947) Properly handle errors when looking for the external clock +- m68k: Handle arrivals of multiple signals correctly +- mac80211: Drop frames from invalid MAC address in ad-hoc mode +- netfilter: nf_nat_masquerade: defer conntrack walk to work queue +- netfilter: nf_nat_masquerade: make async masq_inet6_event handling generic +- ASoC: SOF: loader: release_firmware() on load failure to avoid batching +- HID: wacom: Add new Intuos BT (CTL-4100WL/CTL-6100WL) device IDs +- netfilter: ip6_tables: zero-initialize fragment offset +- HID: apple: Fix logical maximum and usage maximum of Magic Keyboard JIS +- ASoC: Intel: sof_sdw: tag SoundWire BEs as non-atomic +- x86/hpet: Use another crystalball to evaluate HPET usability +- x86/entry: Clear X86_FEATURE_SMAP when CONFIG_X86_SMAP=n +- x86/entry: Correct reference to intended CONFIG_64_BIT +- x86/sev: Return an error on a returned non-zero SW_EXITINFO1[31:0] +- x86/Kconfig: Correct reference to MWINCHIP3D +- x86/platform/olpc: Correct ifdef symbol to intended CONFIG_OLPC_XO15_SCI +- pseries/eeh: Fix the kdump kernel crash during eeh_pseries_init +- powerpc/64s: fix program check interrupt emergency stack path +- powerpc/bpf: Fix BPF_SUB when imm == 0x80000000 +- RISC-V: Include clone3() on rv32 +- bpf, s390: Fix potential memory leak about jit_data +- riscv/vdso: make arch_setup_additional_pages wait for mmap_sem for write killable +- i2c: mediatek: Add OFFSET_EXT_CONF setting back +- i2c: acpi: fix resource leak in reconfiguration device addition +- powerpc/iommu: Report the correct most efficient DMA mask for PCI devices +- net: prefer socket bound to interface when not in VRF +- i40e: Fix freeing of uninitialized misc IRQ vector +- i40e: fix endless loop under rtnl +- gve: report 64bit tx_bytes counter from gve_handle_report_stats() +- gve: fix gve_get_stats() +- rtnetlink: fix if_nlmsg_stats_size() under estimation +- gve: Avoid freeing NULL pointer +- gve: Correct available tx qpl check +- drm/nouveau/debugfs: fix file release memory leak +- drm/nouveau/kms/nv50-: fix file release memory leak +- drm/nouveau: avoid a use-after-free when BO init fails +- video: fbdev: gbefb: Only instantiate device when built for IP32 +- drm/sun4i: dw-hdmi: Fix HDMI PHY clock setup +- bus: ti-sysc: Use CLKDM_NOAUTO for dra7 dcan1 for errata i893 +- perf jevents: Tidy error handling +- netlink: annotate data races around nlk->bound +- net: sfp: Fix typo in state machine debug string +- net/sched: sch_taprio: properly cancel timer from taprio_destroy() +- net: bridge: fix under estimation in br_get_linkxstats_size() +- net: bridge: use nla_total_size_64bit() in br_get_linkxstats_size() +- ARM: imx6: disable the GIC CPU interface before calling stby-poweroff sequence +- dt-bindings: drm/bridge: ti-sn65dsi86: Fix reg value +- arm64: dts: ls1028a: add missing CAN nodes +- ptp_pch: Load module automatically if ID matches +- powerpc/fsl/dts: Fix phy-connection-type for fm1mac3 +- net_sched: fix NULL deref in fifo_set_limit() +- phy: mdio: fix memory leak +- net/mlx5: E-Switch, Fix double allocation of acl flow counter +- net/mlx5e: IPSEC RX, enable checksum complete +- soc: ti: omap-prm: Fix external abort for am335x pruss +- bpf, arm: Fix register clobbering in div/mod implementation +- iwlwifi: pcie: add configuration of a Wi-Fi adapter on Dell XPS 15 +- xtensa: call irqchip_init only when CONFIG_USE_OF is selected +- xtensa: use CONFIG_USE_OF instead of CONFIG_OF +- arm64: dts: qcom: pm8150: use qcom,pm8998-pon binding +- ath5k: fix building with LEDS=m +- PCI: hv: Fix sleep while in non-sleep context when removing child devices from the bus +- ARM: dts: imx6qdl-pico: Fix Ethernet support +- ARM: dts: imx: Fix USB host power regulator polarity on M53Menlo +- ARM: dts: imx: Add missing pinctrl-names for panel on M53Menlo +- soc: qcom: mdt_loader: Drop PT_LOAD check on hash segment +- ARM: at91: pm: do not panic if ram controllers are not enabled +- ARM: dts: qcom: apq8064: Use 27MHz PXO clock as DSI PLL reference +- soc: qcom: socinfo: Fixed argument passed to platform_set_data() +- bus: ti-sysc: Add break in switch statement in sysc_init_soc() +- riscv: Flush current cpu icache before other cpus +- ARM: dts: qcom: apq8064: use compatible which contains chipid +- ARM: dts: imx6dl-yapp4: Fix lp5562 LED driver probe +- ARM: dts: omap3430-sdp: Fix NAND device node +- xen/balloon: fix cancelled balloon action +- SUNRPC: fix sign error causing rpcsec_gss drops +- nfsd4: Handle the NFSv4 READDIR 'dircount' hint being zero +- nfsd: fix error handling of register_pernet_subsys() in init_nfsd() +- ovl: fix IOCB_DIRECT if underlying fs doesn't support direct IO +- ovl: fix missing negative dentry check in ovl_rename() +- mmc: sdhci-of-at91: replace while loop with read_poll_timeout +- mmc: sdhci-of-at91: wait for calibration done before proceed +- mmc: meson-gx: do not use memcpy_to/fromio for dram-access-quirk +- xen/privcmd: fix error handling in mmap-resource processing +- drm/nouveau/kms/tu102-: delay enabling cursor until after assign_windows +- usb: typec: tcpm: handle SRC_STARTUP state if cc changes +- USB: cdc-acm: fix break reporting +- USB: cdc-acm: fix racy tty buffer accesses +- usb: chipidea: ci_hdrc_imx: Also search for 'phys' phandle +- Partially revert "usb: Kconfig: using select for USB_COMMON dependency" +- nbd: fix uaf in nbd_handle_reply() +- nbd: partition nbd_read_stat() into nbd_read_reply() and nbd_handle_reply() +- nbd: clean up return value checking of sock_xmit() +- nbd: don't start request if nbd_queue_rq() failed +- nbd: check sock index in nbd_read_stat() +- nbd: make sure request completion won't concurrent +- nbd: don't handle response without a corresponding request message +- libata: Add ATA_HORKAGE_NO_NCQ_ON_ATI for Samsung 860 and 870 SSD. +- perf/x86: Reset destroy callback on event init failure +- KVM: x86: nSVM: restore int_vector in svm_clear_vintr +- kvm: x86: Add AMD PMU MSRs to msrs_to_save_all[] +- KVM: do not shrink halt_poll_ns below grow_start +- selftests: KVM: Align SMCCC call with the spec in steal_time +- tools/vm/page-types: remove dependency on opt_file for idle page tracking +- smb3: correct smb3 ACL security descriptor +- irqchip/gic: Work around broken Renesas integration +- scsi: ses: Retry failed Send/Receive Diagnostic commands +- thermal/drivers/tsens: Fix wrong check for tzd in irq handlers +- nvme-fc: avoid race between time out and tear down +- nvme-fc: update hardware queues before using them +- selftests:kvm: fix get_warnings_count() ignoring fscanf() return warn +- selftests: be sure to make khdr before other targets +- habanalabs/gaudi: fix LBW RR configuration +- usb: dwc2: check return value after calling platform_get_resource() +- usb: testusb: Fix for showing the connection speed +- scsi: sd: Free scsi_disk device via put_device() +- ext2: fix sleeping in atomic bugs on error +- sparc64: fix pci_iounmap() when CONFIG_PCI is not set +- xen-netback: correct success/error reporting for the SKB-with-fraglist case +- net: mdio: introduce a shutdown method to mdio device drivers +- btrfs: fix mount failure due to past and transient device flush error +- btrfs: replace BUG_ON() in btrfs_csum_one_bio() with proper error handling +- nfsd: back channel stuck in SEQ4_STATUS_CB_PATH_DOWN +- platform/x86: touchscreen_dmi: Update info for the Chuwi Hi10 Plus (CWI527) tablet +- platform/x86: touchscreen_dmi: Add info for the Chuwi HiBook (CWI514) tablet +- spi: rockchip: handle zero length transfers without timing out +- netfilter: nf_tables: Fix oversized kvmalloc() calls +- netfilter: conntrack: serialize hash resizes and cleanups +- KVM: x86: Handle SRCU initialization failure during page track init +- HID: usbhid: free raw_report buffers in usbhid_stop +- mm: don't allow oversized kvmalloc() calls +- netfilter: ipset: Fix oversized kvmalloc() calls +- HID: betop: fix slab-out-of-bounds Write in betop_probe +- usb: hso: remove the bailout parameter +- ASoC: dapm: use component prefix when checking widget names +- net: udp: annotate data race around udp_sk(sk)->corkflag +- HID: u2fzero: ignore incomplete packets without data +- ext4: add error checking to ext4_ext_replay_set_iblocks() +- ext4: fix reserved space counter leakage +- ext4: limit the number of blocks in one ADD_RANGE TLV +- ext4: fix loff_t overflow in ext4_max_bitmap_size() +- ipack: ipoctal: fix module reference leak +- ipack: ipoctal: fix missing allocation-failure check +- ipack: ipoctal: fix tty-registration error handling +- ipack: ipoctal: fix tty registration race +- ipack: ipoctal: fix stack information leak +- debugfs: debugfs_create_file_size(): use IS_ERR to check for error +- elf: don't use MAP_FIXED_NOREPLACE for elf interpreter mappings +- nvme: add command id quirk for apple controllers +- hwmon: (pmbus/mp2975) Add missed POUT attribute for page 1 mp2975 controller +- perf/x86/intel: Update event constraints for ICX +- af_unix: fix races in sk_peer_pid and sk_peer_cred accesses +- net: sched: flower: protect fl_walk() with rcu +- net: phy: bcm7xxx: Fixed indirect MMD operations +- net: hns3: fix always enable rx vlan filter problem after selftest +- net: hns3: fix prototype warning +- net: hns3: fix show wrong state when add existing uc mac address +- net: hns3: fix mixed flag HCLGE_FLAG_MQPRIO_ENABLE and HCLGE_FLAG_DCB_ENABLE +- net: hns3: do not allow call hns3_nic_net_open repeatedly +- ixgbe: Fix NULL pointer dereference in ixgbe_xdp_setup +- scsi: csiostor: Add module softdep on cxgb4 +- Revert "block, bfq: honor already-setup queue merges" +- net: ks8851: fix link error +- selftests, bpf: test_lwt_ip_encap: Really disable rp_filter +- selftests, bpf: Fix makefile dependencies on libbpf +- bpf: Exempt CAP_BPF from checks against bpf_jit_limit +- e100: fix buffer overrun in e100_get_regs +- e100: fix length calculation in e100_get_regs_len +- dsa: mv88e6xxx: Include tagger overhead when setting MTU for DSA and CPU ports +- dsa: mv88e6xxx: Fix MTU definition +- dsa: mv88e6xxx: 6161: Use chip wide MAX MTU +- drm/i915/request: fix early tracepoints +- smsc95xx: fix stalled rx after link change +- net: ipv4: Fix rtnexthop len when RTA_FLOW is present +- net: enetc: fix the incorrect clearing of IF_MODE bits +- hwmon: (tmp421) fix rounding for negative values +- hwmon: (tmp421) report /PVLD condition as fault +- mptcp: don't return sockets in foreign netns +- sctp: break out if skb_header_pointer returns NULL in sctp_rcv_ootb +- mac80211-hwsim: fix late beacon hrtimer handling +- mac80211: mesh: fix potentially unaligned access +- mac80211: limit injected vht mcs/nss in ieee80211_parse_tx_radiotap +- mac80211: Fix ieee80211_amsdu_aggregate frag_tail bug +- hwmon: (mlxreg-fan) Return non-zero value when fan current state is enforced from sysfs +- RDMA/cma: Fix listener leak in rdma_cma_listen_on_all() failure +- IB/cma: Do not send IGMP leaves for sendonly Multicast groups +- bpf: Handle return value of BPF_PROG_TYPE_STRUCT_OPS prog +- ipvs: check that ip_vs_conn_tab_bits is between 8 and 20 +- drm/amdgpu: correct initial cp_hqd_quantum for gfx9 +- drm/amd/display: Pass PCI deviceid into DC +- RDMA/cma: Do not change route.addr.src_addr.ss_family +- media: ir_toy: prevent device from hanging during transmit +- KVM: rseq: Update rseq when processing NOTIFY_RESUME on xfer to KVM guest +- KVM: nVMX: Filter out all unsupported controls when eVMCS was activated +- KVM: x86: nSVM: don't copy virt_ext from vmcb12 +- KVM: x86: Fix stack-out-of-bounds memory access from ioapic_write_indirect() +- x86/kvmclock: Move this_cpu_pvti into kvmclock.h +- mac80211: fix use-after-free in CCMP/GCMP RX +- scsi: ufs: Fix illegal offset in UPIU event trace +- gpio: pca953x: do not ignore i2c errors +- hwmon: (w83791d) Fix NULL pointer dereference by removing unnecessary structure field +- hwmon: (w83792d) Fix NULL pointer dereference by removing unnecessary structure field +- hwmon: (w83793) Fix NULL pointer dereference by removing unnecessary structure field +- hwmon: (tmp421) handle I2C errors +- fs-verity: fix signed integer overflow with i_size near S64_MAX +- ACPI: NFIT: Use fallback node id when numa info in NFIT table is incorrect +- ALSA: hda/realtek: Quirks to enable speaker output for Lenovo Legion 7i 15IMHG05, Yoga 7i 14ITL5/15ITL5, and 13s Gen2 laptops. +- usb: cdns3: fix race condition before setting doorbell +- cpufreq: schedutil: Destroy mutex before kobject_put() frees the memory +- scsi: qla2xxx: Changes to support kdump kernel for NVMe BFS +- cpufreq: schedutil: Use kobject release() method to free sugov_tunables +- tty: Fix out-of-bound vmalloc access in imageblit +- ubifs: ubifs_dump_node: Dump all branches of the index node +- ubifs: ubifs_dump_sleb: Remove unused function +- ubifs: Pass node length in all node dumping callers +- ubifs: Remove the redundant return in dbg_check_nondata_nodes_order +- Revert "ubifs: Fix out-of-bounds memory access caused by abnormal value of node_len" +- ubifs: Limit dumping length by size of memory which is allocated for the node +- ext4: prevent partial update of the extent blocks +- ext4: check for inconsistent extents between index and leaf block +- ext4: check for out-of-order index extents in ext4_valid_extent_entries() +- quota: correct error number in free_dqentry() +- quota: check block number when reading the block in quota file +- mm: rmap: explicitly reset vma->anon_vma in unlink_anon_vmas() +- cgroup: Fix memory leak caused by missing cgroup_bpf_offline +- qnx4: work around gcc false positive warning bug +- xen/balloon: fix balloon kthread freezing +- USB: serial: cp210x: fix dropped characters with CP2102 +- thermal/drivers/int340x: Do not set a wrong tcc offset on resume +- EDAC/dmc520: Assign the proper type to dimm->edac_mode +- EDAC/synopsys: Fix wrong value type assignment for edac_mode +- spi: Fix tegra20 build with CONFIG_PM=n +- net: 6pack: Fix tx timeout and slot time +- alpha: Declare virt_to_phys and virt_to_bus parameter as pointer to volatile +- arm64: Mark __stack_chk_guard as __ro_after_init +- parisc: Use absolute_pointer() to define PAGE0 +- qnx4: avoid stringop-overread errors +- sparc: avoid stringop-overread errors +- net: i825xx: Use absolute_pointer for memcpy from fixed memory location +- compiler.h: Introduce absolute_pointer macro +- block: flush the integrity workqueue in blk_integrity_unregister +- block: check if a profile is actually registered in blk_integrity_unregister +- amd/display: downgrade validation failure log level +- sparc32: page align size in arch_dma_alloc +- nvme-rdma: destroy cm id before destroy qp to avoid use after free +- nvme-multipath: fix ANA state updates when a namespace is not present +- xen/balloon: use a kernel thread instead a workqueue +- bpf: Add oversize check before call kvcalloc() +- cpufreq: intel_pstate: Override parameters if HWP forced by BIOS +- ipv6: delay fib6_sernum increase in fib6_add +- m68k: Double cast io functions to unsigned long +- blk-mq: avoid to iterate over stale request +- net: stmmac: allow CSR clock of 300MHz +- net: macb: fix use after free on rmmod +- net: phylink: Update SFP selected interface on advertising changes +- io_uring: put provided buffer meta data under memcg accounting +- x86/asm: Fix SETZ size enqcmds() build failure +- x86/asm: Add a missing __iomem annotation in enqcmds() +- md: fix a lock order reversal in md_alloc +- irqchip/gic-v3-its: Fix potential VPE leak on error +- irqchip/goldfish-pic: Select GENERIC_IRQ_CHIP to fix build +- scsi: lpfc: Use correct scnprintf() limit +- scsi: qla2xxx: Restore initiator in dual mode +- cifs: fix a sign extension bug +- thermal/core: Potential buffer overflow in thermal_build_list_of_policies() +- nvme: keep ctrl->namespaces ordered +- treewide: Change list_sort to use const pointers +- nvme-tcp: fix incorrect h2cdata pdu offset accounting +- fpga: machxo2-spi: Fix missing error code in machxo2_write_complete() +- fpga: machxo2-spi: Return an error on failure +- tty: synclink_gt: rename a conflicting function name +- tty: synclink_gt, drop unneeded forward declarations +- scsi: target: Fix the pgr/alua_support_store functions +- scsi: iscsi: Adjust iface sysfs attr detection +- atlantic: Fix issue in the pm resume flow. +- net/mlx4_en: Don't allow aRFS for encapsulated packets +- qed: rdma - don't wait for resources under hw error recovery flow +- gpio: uniphier: Fix void functions to remove return value +- s390/qeth: fix NULL deref in qeth_clear_working_pool_list() +- kselftest/arm64: signal: Skip tests if required features are missing +- kselftest/arm64: signal: Add SVE to the set of features we can check for +- net: dsa: realtek: register the MDIO bus under devres +- net: dsa: don't allocate the slave_mii_bus using devres +- net/smc: fix 'workqueue leaked lock' in smc_conn_abort_work +- net/smc: add missing error check in smc_clc_prfx_set() +- bnxt_en: Fix TX timeout when TX ring size is set to the smallest +- enetc: Fix uninitialized struct dim_sample field usage +- enetc: Fix illegal access when reading affinity_hint +- platform/x86/intel: punit_ipc: Drop wrong use of ACPI_PTR() +- afs: Fix updating of i_blocks on file/dir extension +- afs: Fix incorrect triggering of sillyrename on 3rd-party invalidation +- comedi: Fix memory leak in compat_insnlist() +- net: hso: fix muxed tty registration +- drm/amd/pm: Update intermediate power state for SI +- scsi: sd_zbc: Ensure buffer size is aligned to SECTOR_SIZE +- serial: mvebu-uart: fix driver's tx_empty callback +- serial: 8250: 8250_omap: Fix RX_LVL register offset +- xhci: Set HCD flag to defer primary roothub registration +- btrfs: prevent __btrfs_dump_space_info() to underflow its free space +- erofs: fix up erofs_lookup tracepoint +- mcb: fix error handling in mcb_alloc_bus() +- USB: serial: option: add device id for Foxconn T99W265 +- USB: serial: option: remove duplicate USB device ID +- USB: serial: option: add Telit LN920 compositions +- USB: serial: mos7840: remove duplicated 0xac24 device ID +- usb: core: hcd: Add support for deferring roothub registration +- usb: dwc3: core: balance phy init and exit +- Re-enable UAS for LaCie Rugged USB3-FW with fk quirk +- staging: greybus: uart: fix tty use after free +- binder: make sure fd closes complete +- Revert "USB: bcma: Add a check for devm_gpiod_get" +- USB: cdc-acm: fix minor-number release +- USB: serial: cp210x: add ID for GW Instek GDM-834x Digital Multimeter +- usb-storage: Add quirk for ScanLogic SL11R-IDE older than 2.6c +- xen/x86: fix PV trap handling on secondary processors +- cifs: fix incorrect check for null pointer in header_assemble +- usb: musb: tusb6010: uninitialized data in tusb_fifo_write_unaligned() +- usb: dwc2: gadget: Fix ISOC transfer complete handling for DDMA +- usb: dwc2: gadget: Fix ISOC flow for BDMA and Slave +- usb: gadget: r8a66597: fix a loop in set_feature() +- ocfs2: drop acl cache for directories too +- PCI: aardvark: Increase polling delay to 1.5s while waiting for PIO response +- drm/amdgpu: fix out of bounds write +- sched/topology: Fix sched_domain_topology_level alloc in sched_init_numa() +- arm64: Avoid premature usercopy failure +- livepatch: Check whole stack when CONFIG_PREEMPT is set +- arm64: remove page granularity limitation from KFENCE +- drm/nouveau/nvkm: Replace -ENOSYS with -ENODEV +- sched/idle: Make the idle timer expire in hard interrupt context +- rtc: rx8010: select REGMAP_I2C +- blk-mq: allow 4x BLK_MAX_REQUEST_COUNT at blk_plug for multiple_queues +- pwm: stm32-lp: Don't modify HW state in .remove() callback +- pwm: rockchip: Don't modify HW state in .remove() callback +- pwm: img: Don't modify HW state in .remove() callback +- habanalabs: add validity check for event ID received from F/W +- nilfs2: fix memory leak in nilfs_sysfs_delete_snapshot_group +- nilfs2: fix memory leak in nilfs_sysfs_create_snapshot_group +- nilfs2: fix memory leak in nilfs_sysfs_delete_##name##_group +- nilfs2: fix memory leak in nilfs_sysfs_create_##name##_group +- nilfs2: fix NULL pointer in nilfs_##name##_attr_release +- nilfs2: fix memory leak in nilfs_sysfs_create_device_group +- btrfs: fix lockdep warning while mounting sprout fs +- btrfs: update the bdev time directly when closing +- ceph: lockdep annotations for try_nonblocking_invalidate +- ceph: remove the capsnaps when removing caps +- ceph: request Fw caps before updating the mtime in ceph_write_iter +- dmaengine: xilinx_dma: Set DMA mask for coherent APIs +- dmaengine: ioat: depends on !UML +- dmaengine: sprd: Add missing MODULE_DEVICE_TABLE +- dmaengine: idxd: depends on !UML +- iommu/amd: Relocate GAMSup check to early_enable_iommus +- parisc: Move pci_dev_is_behind_card_dino to where it is used +- dma-buf: DMABUF_MOVE_NOTIFY should depend on DMA_SHARED_BUFFER +- drivers: base: cacheinfo: Get rid of DEFINE_SMP_CALL_CACHE_FUNCTION() +- drm/amdgpu: Disable PCIE_DPM on Intel RKL Platform +- thermal/core: Fix thermal_cooling_device_register() prototype +- tools/bootconfig: Fix tracing_on option checking in ftrace2bconf.sh +- Kconfig.debug: drop selecting non-existing HARDLOCKUP_DETECTOR_ARCH +- ceph: cancel delayed work instead of flushing on mdsc teardown +- ceph: allow ceph_put_mds_session to take NULL or ERR_PTR +- platform/chrome: cros_ec_trace: Fix format warnings +- platform/chrome: sensorhub: Add trace events for sample +- dmaengine: idxd: fix wq slot allocation index check +- pwm: mxs: Don't modify HW state in .probe() after the PWM chip was registered +- pwm: lpc32xx: Don't modify HW state in .probe() after the PWM chip was registered +- PM: sleep: core: Avoid setting power.must_resume to false +- profiling: fix shift-out-of-bounds bugs +- nilfs2: use refcount_dec_and_lock() to fix potential UAF +- prctl: allow to setup brk for et_dyn executables +- 9p/trans_virtio: Remove sysfs file on probe failure +- thermal/drivers/exynos: Fix an error code in exynos_tmu_probe() +- perf tools: Allow build-id with trailing zeros +- tools lib: Adopt memchr_inv() from kernel +- perf test: Fix bpf test sample mismatch reporting +- dmaengine: acpi: Avoid comparison GSI with Linux vIRQ +- um: virtio_uml: fix memory leak on init failures +- coredump: fix memleak in dump_vma_snapshot() +- staging: rtl8192u: Fix bitwise vs logical operator in TranslateRxSignalStuff819xUsb() +- Revert "net/mlx5: Register to devlink ingress VLAN filter trap" +- s390/pci_mmio: fully validate the VMA before calling follow_pte() +- console: consume APC, DM, DCS +- PCI: aardvark: Fix reporting CRS value +- PCI: pci-bridge-emul: Add PCIe Root Capabilities Register +- media: firewire: firedtv-avc: fix a buffer overflow in avc_ca_pmt() +- ext4: fix potential infinite loop in ext4_dx_readdir() +- mm: memcontrol: set the correct memcg swappiness restriction +- mm, vmscan: guarantee drop_slab_node() termination +- powerpc/numa: Update cpu_cpu_map on CPU online/offline +- powerpc/powernv/pci: fix a RCU-list lock +- blktrace: Fix uaf in blk_trace access after removing by sysfs +- ext4: drop unnecessary journal handle in delalloc write +- ext4: factor out write end code of inline file +- ext4: correct the error path of ext4_write_inline_data_end() +- ext4: check and update i_disksize properly +- efi: Change down_interruptible() in virt_efi_reset_system() to down_trylock() +- ramfs: fix mount source show for ramfs +- fs: add vfs_parse_fs_param_source() helper +- blk-cgroup: fix UAF by grabbing blkcg lock before destroying blkg pd +- block: fix memory leak for mq shared sbitmap +- ia64: ensure proper NUMA distance and possible map initialization +- sched/topology: Make sched_init_numa() use a set for the deduplicating sort +- sched/topology: fix the issue groups don't span domain->span for NUMA diameter > 2 +- sched/topology: Warn when NUMA diameter > 2 +- nbd: add the check to prevent overflow in __nbd_ioctl() +- block: fix UAF from race of ioc_release_fn() and __ioc_clear_queue() +- blk-throttle: fix UAF by deleteing timer in blk_throtl_exit() +- block: don't call rq_qos_ops->done_bio if the bio isn't tracked +- kabi: Introduce KABI_RESERVE macro for openEuler kernel +- sched/fair: fix sd_llc_alloc_all() compile error + +* Thu Nov 11 2021 Zheng Zengkai - 5.10.0-17.0.0.7 +- net: phy: realtek: net: Fix less than zero comparison of a u16 +- net: phy: realtek: add dt property to enable ALDPS mode +- net: phy: realtek: add dt property to disable CLKOUT clock +- openeuler_defconfig: Build HISI PMU drivers as modules. +- configs: add config BMA to config files +- Huawei BMA: Adding Huawei BMA driver: cdev_veth_drv +- Huawei BMA: Adding Huawei BMA driver: host_kbox_drv +- Huawei BMA: Adding Huawei BMA driver: host_veth_drv +- Huawei BMA: Adding Huawei BMA driver: host_cdev_drv +- Huawei BMA: Adding Huawei BMA driver: host_edma_drv +- page_pool: disable dma mapping support for 32-bit arch with 64-bit DMA +- page_pool: use relaxed atomic for release side accounting +- net: hns3: add option to turn off page pool feature +- net: hns3: support skb's frag page recycling based on page pool +- page_pool: add frag page recycling support in page pool +- page_pool: add interface to manipulate frag count in page pool +- page_pool: keep pp info as long as page pool owns the page +- page_pool: mask the page->signature before the checking +- skbuff: Fix a potential race while recycling page_pool packets +- net: ti: add pp skb recycling support +- mvpp2: prefetch page +- mvpp2: prefetch right address +- mvneta: recycle buffers +- mvpp2: recycle buffers +- page_pool: Allow drivers to hint on SKB recycling +- skbuff: add a parameter to __skb_frag_unref +- mm: add a signature in struct page +- net: page_pool: simplify page recycling condition tests +- skbuff: Call skb_zcopy_clear() before unref'ing fragments +- net: page_pool: Add bulk support for ptr_ring +- MAINTAINERS: update for DAMON +- mm/damon: add user space selftests +- mm/damon: add kunit tests +- Documentation: add documents for DAMON +- mm/damon/dbgfs: support multiple contexts +- mm/damon/dbgfs: export kdamond pid to the user space +- mm/damon: implement a debugfs-based user space interface +- mm/damon: add a tracepoint +- mm/damon: implement primitives for the virtual memory address spaces +- mm/idle_page_tracking: make PG_idle reusable +- mm/damon: adaptively adjust regions +- mm/damon/core: implement region-based sampling +- mm: introduce Data Access MONitor (DAMON) +- sched/fair: fix try_steal compile error +- config: enable CONFIG_SCHED_STEAL by default +- sched/fair: introduce SCHED_STEAL +- disable stealing by default +- sched/fair: Provide idle search schedstats +- sched/fair: disable stealing if too many NUMA nodes +- sched/fair: Steal work from an overloaded CPU when CPU goes idle +- sched/fair: Provide can_migrate_task_llc +- sched/fair: Generalize the detach_task interface +- sched/fair: Hoist idle_stamp up from idle_balance +- sched/fair: Dynamically update cfs_overload_cpus +- sched/topology: Provide cfs_overload_cpus bitmap +- sched/topology: Provide hooks to allocate data shared per LLC +- sched: Provide sparsemask, a reduced contention bitmap +- psi: introduce psi_v1 boot parameter +- psi: support psi under cgroup v1 +- spfc: Fix compile errors when O=xxx is specified + +* Sat Oct 30 2021 Zheng Zengkai - 5.10.0-16.0.0.6 +- openeuler_defconfig: Enable CONFIG_HW_RANDOM_HISI_GM by default +- hwrng: add hisilicon GM auth trng driver +- cgroup/files: support boot parameter to control if disable files cgroup +- files_cgroup: Fix soft lockup when refcnt overflow. +- filescontrol: silence suspicious RCU warning +- mm/memcg: fix NULL pointer dereference in memcg_slab_free_hook() +- mm: memcontrol: move PageMemcgKmem to the scope of CONFIG_MEMCG_KMEM +- mm: memcontrol: inline __memcg_kmem_{un}charge() into obj_cgroup_{un}charge_pages() +- mm: memcontrol: use obj_cgroup APIs to charge kmem pages +- mm: memcontrol: change ug->dummy_page only if memcg changed +- mm: memcontrol: directly access page->memcg_data in mm/page_alloc.c +- mm: memcontrol: introduce obj_cgroup_{un}charge_pages +- mm: Convert page kmemcg type to a page memcg flag +- mm: Introduce page memcg flags +- mm: memcontrol/slab: Use helpers to access slab page's memcg_data +- mm: memcontrol: Use helpers to read page's memcg data +- scsi: spfc: initial commit the spfc module +- mmap: userswap: fix some format issues +- mmap: userswap: fix memory leak in do_mmap +- perf stat: Add --quiet option + +* Tue Oct 26 2021 Zheng Zengkai - 5.10.0-15.0.0.5 +- net: dsa: bcm_sf2: Fix array overrun in bcm_sf2_num_active_ports() +- bnxt_en: Fix error recovery regression +- x86/mce: Avoid infinite loop for copy from user recovery +- net: renesas: sh_eth: Fix freeing wrong tx descriptor +- mfd: lpc_sch: Rename GPIOBASE to prevent build error +- mfd: lpc_sch: Partially revert "Add support for Intel Quark X1000" +- bnxt_en: Fix possible unintended driver initiated error recovery +- bnxt_en: Improve logging of error recovery settings information. +- bnxt_en: Convert to use netif_level() helpers. +- bnxt_en: Consolidate firmware reset event logging. +- bnxt_en: log firmware debug notifications +- bnxt_en: Fix asic.rev in devlink dev info command +- bnxt_en: fix stored FW_PSID version masks +- net: dsa: b53: Fix IMP port setup on BCM5301x +- ip_gre: validate csum_start only on pull +- qlcnic: Remove redundant unlock in qlcnic_pinit_from_rom +- fq_codel: reject silly quantum parameters +- netfilter: socket: icmp6: fix use-after-scope +- net: dsa: b53: Set correct number of ports in the DSA struct +- net: dsa: b53: Fix calculating number of switch ports +- net: hso: add failure handler for add_net_device +- selftests: mptcp: clean tmp files in simult_flows +- net: dsa: tag_rtl4_a: Fix egress tags +- gpio: mpc8xxx: Use 'devm_gpiochip_add_data()' to simplify the code and avoid a leak +- gpio: mpc8xxx: Fix a resources leak in the error handling path of 'mpc8xxx_probe()' +- perf bench inject-buildid: Handle writen() errors +- perf unwind: Do not overwrite FEATURE_CHECK_LDFLAGS-libunwind-{x86,aarch64} +- ARC: export clear_user_page() for modules +- mtd: rawnand: cafe: Fix a resource leak in the error handling path of 'cafe_nand_probe()' +- PCI: Sync __pci_register_driver() stub for CONFIG_PCI=n +- KVM: arm64: Handle PSCI resets before userspace touches vCPU state +- KVM: arm64: Fix read-side race on updates to vcpu reset state +- tracing/boot: Fix a hist trigger dependency for boot time tracing +- mfd: tqmx86: Clear GPIO IRQ resource when no IRQ is set +- PCI: Fix pci_dev_str_match_path() alloc while atomic bug +- KVM: arm64: Restrict IPA size to maximum 48 bits on 4K and 16K page size +- netfilter: nft_ct: protect nft_ct_pcpu_template_refcnt with mutex +- netfilter: Fix fall-through warnings for Clang +- PCI: iproc: Fix BCMA probe resource handling +- PCI: of: Don't fail devm_pci_alloc_host_bridge() on missing 'ranges' +- backlight: ktd253: Stabilize backlight +- mfd: axp20x: Update AXP288 volatile ranges +- s390/bpf: Fix branch shortening during codegen pass +- s390/bpf: Fix 64-bit subtraction of the -0x80000000 constant +- s390/bpf: Fix optimizing out zero-extensions +- NTB: perf: Fix an error code in perf_setup_inbuf() +- NTB: Fix an error code in ntb_msit_probe() +- ethtool: Fix an error code in cxgb2.c +- PCI: ibmphp: Fix double unmap of io_mem +- block, bfq: honor already-setup queue merges +- net: usb: cdc_mbim: avoid altsetting toggling for Telit LN920 +- Set fc_nlinfo in nh_create_ipv4, nh_create_ipv6 +- octeontx2-af: Add additional register check to rvu_poll_reg() +- watchdog: Start watchdog in watchdog_set_last_hw_keepalive only if appropriate +- PCI: Add ACS quirks for Cavium multi-function devices +- PCI: j721e: Add PCIe support for AM64 +- PCI: j721e: Add PCIe support for J7200 +- PCI: cadence: Add quirk flag to set minimum delay in LTSSM Detect.Quiet state +- PCI: cadence: Use bitfield for *quirk_retrain_flag* instead of bool +- tracing/probes: Reject events which have the same name of existing one +- PCI: rcar: Fix runtime PM imbalance in rcar_pcie_ep_probe() +- mfd: Don't use irq_create_mapping() to resolve a mapping +- PCI: tegra: Fix OF node reference leak +- PCI: tegra194: Fix MSI-X programming +- PCI: tegra194: Fix handling BME_CHGED event +- fuse: fix use after free in fuse_read_interrupt() +- PCI: Add ACS quirks for NXP LX2xx0 and LX2xx2 platforms +- mfd: db8500-prcmu: Adjust map to reality +- dt-bindings: mtd: gpmc: Fix the ECC bytes vs. OOB bytes equation +- mm/memory_hotplug: use "unsigned long" for PFN in zone_for_pfn_range() +- bnxt_en: make bnxt_free_skbs() safe to call after bnxt_free_mem() +- KVM: PPC: Book3S HV: Tolerate treclaim. in fake-suspend mode changing registers +- ibmvnic: check failover_pending in login response +- dt-bindings: arm: Fix Toradex compatible typo +- udp_tunnel: Fix udp_tunnel_nic work-queue type +- qed: Handle management FW error +- selftest: net: fix typo in altname test +- tcp: fix tp->undo_retrans accounting in tcp_sacktag_one() +- x86/uaccess: Fix 32-bit __get_user_asm_u64() when CC_HAS_ASM_GOTO_OUTPUT=y +- net: dsa: destroy the phylink instance on any error in dsa_slave_phy_setup +- net/af_unix: fix a data-race in unix_dgram_poll +- vhost_net: fix OoB on sendmsg() failure. +- gen_compile_commands: fix missing 'sys' package +- net: ipa: initialize all filter table slots +- events: Reuse value read using READ_ONCE instead of re-reading it +- nvme-tcp: fix io_work priority inversion +- net/mlx5: Fix potential sleeping in atomic context +- net/mlx5: FWTrace, cancel work on alloc pd error flow +- perf machine: Initialize srcline string member in add_location struct +- drm/rockchip: cdn-dp-core: Make cdn_dp_core_resume __maybe_unused +- tipc: increase timeout in tipc_sk_enqueue() +- r6040: Restore MDIO clock frequency after MAC reset +- net/l2tp: Fix reference count leak in l2tp_udp_recv_core +- dccp: don't duplicate ccid when cloning dccp sock +- ptp: dp83640: don't define PAGE0 +- net-caif: avoid user-triggerable WARN_ON(1) +- net/{mlx5|nfp|bnxt}: Remove unnecessary RTNL lock assert +- ethtool: Fix rxnfc copy to user buffer overflow +- tipc: fix an use-after-free issue in tipc_recvmsg +- x86/mm: Fix kern_addr_valid() to cope with existing but not present entries +- x86/pat: Pass valid address to sanitize_phys() +- s390/sclp: fix Secure-IPL facility detection +- drm/etnaviv: add missing MMU context put when reaping MMU mapping +- drm/etnaviv: reference MMU context when setting up hardware state +- drm/etnaviv: fix MMU context leak on GPU reset +- drm/etnaviv: exec and MMU state is lost when resetting the GPU +- drm/etnaviv: keep MMU context across runtime suspend/resume +- drm/etnaviv: stop abusing mmu_context as FE running marker +- drm/etnaviv: put submit prev MMU context when it exists +- drm/etnaviv: return context from etnaviv_iommu_context_get +- drm/amd/amdgpu: Increase HWIP_MAX_INSTANCE to 10 +- PCI: Add AMD GPU multi-function power dependencies +- PM: base: power: don't try to use non-existing RTC for storing data +- arm64/sve: Use correct size when reinitialising SVE state +- bnx2x: Fix enabling network interfaces without VFs +- xen: reset legacy rtc flag for PV domU +- btrfs: fix upper limit for max_inline for page size 64K +- drm/bridge: lt9611: Fix handling of 4k panels +- fanotify: limit number of event merge attempts +- drm/panfrost: Clamp lock region to Bifrost minimum +- drm/panfrost: Use u64 for size in lock_region +- drm/panfrost: Simplify lock_region calculation +- drm/amd/display: Update bounding box states (v2) +- drm/amd/display: Update number of DCN3 clock states +- drm/amdgpu: Fix BUG_ON assert +- drm/panfrost: Make sure MMU context lifetime is not bound to panfrost_priv +- drm/dp_mst: Fix return code on sideband message failure +- drm/msi/mdp4: populate priv->kms in mdp4_kms_init +- drm/mgag200: Select clock in PLL update functions +- net: dsa: lantiq_gswip: fix maximum frame length +- lib/test_stackinit: Fix static initializer test +- platform/chrome: cros_ec_proto: Send command again when timeout occurs +- libnvdimm/pmem: Fix crash triggered when I/O in-flight during unbind +- mm,vmscan: fix divide by zero in get_scan_count +- mm/hugetlb: initialize hugetlb_usage in mm_init +- mm/hmm: bypass devmap pte when all pfn requested flags are fulfilled +- hugetlb: fix hugetlb cgroup refcounting during vma split +- s390/pv: fix the forcing of the swiotlb +- cpufreq: powernv: Fix init_chip_info initialization in numa=off +- scsi: qla2xxx: Sync queue idx with queue_pair_map idx +- scsi: qla2xxx: Changes to support kdump kernel +- scsi: BusLogic: Fix missing pr_cont() use +- ovl: fix BUG_ON() in may_delete() when called from ovl_cleanup() +- parisc: fix crash with signals and alloca +- io_uring: remove duplicated io_size from rw +- fs/io_uring Don't use the return value from import_iovec(). +- net: w5100: check return value after calling platform_get_resource() +- fix array-index-out-of-bounds in taprio_change +- net: fix NULL pointer reference in cipso_v4_doi_free +- ath9k: fix sleeping in atomic context +- ath9k: fix OOB read ar9300_eeprom_restore_internal +- wcn36xx: Fix missing frame timestamp for beacon/probe-resp +- selftests/bpf: Fix potential unreleased lock +- parport: remove non-zero check on count +- net/mlx5: DR, Enable QP retransmission +- net/mlx5: DR, fix a potential use-after-free bug +- iwlwifi: mvm: Fix scan channel flags settings +- iwlwifi: fw: correctly limit to monitor dump +- iwlwifi: mvm: fix access to BSS elements +- iwlwifi: mvm: avoid static queue number aliasing +- iwlwifi: mvm: fix a memory leak in iwl_mvm_mac_ctxt_beacon_changed +- iwlwifi: pcie: free RBs during configure +- nfsd: fix crash on LOCKT on reexported NFSv3 +- drm/amdkfd: Account for SH/SE count when setting up cu masks. +- ASoC: rockchip: i2s: Fixup config for DAIFMT_DSP_A/B +- ASoC: rockchip: i2s: Fix regmap_ops hang +- usbip:vhci_hcd USB port can get stuck in the disabled state +- usbip: give back URBs for unsent unlink requests during cleanup +- usb: musb: musb_dsps: request_irq() after initializing musb +- Revert "USB: xhci: fix U1/U2 handling for hardware with XHCI_INTEL_HOST quirk set" +- cifs: fix wrong release in sess_alloc_buffer() failed path +- mmc: core: Return correct emmc response in case of ioctl error +- selftests/bpf: Enlarge select() timeout for test_maps +- mmc: rtsx_pci: Fix long reads when clock is prescaled +- mmc: sdhci-of-arasan: Check return value of non-void funtions +- mmc: sdhci-of-arasan: Modified SD default speed to 19MHz for ZynqMP +- of: Don't allow __of_attached_node_sysfs() without CONFIG_SYSFS +- ASoC: Intel: Skylake: Fix passing loadable flag for module +- ASoC: Intel: Skylake: Fix module configuration for KPB and MIXER +- soundwire: intel: fix potential race condition during power down +- btrfs: tree-log: check btrfs_lookup_data_extent return value +- m68knommu: only set CONFIG_ISA_DMA_API for ColdFire sub-arch +- octeontx2-pf: Fix NIX1_RX interface backpressure +- rtw88: wow: fix size access error of probe request +- rtw88: wow: build wow function only if CONFIG_PM is on +- rtw88: use read_poll_timeout instead of fixed sleep +- rtl8xxxu: Fix the handling of TX A-MPDU aggregation +- drm/exynos: Always initialize mapping in exynos_drm_register_dma() +- lockd: lockd server-side shouldn't set fl_ops +- usb: chipidea: host: fix port index underflow and UBSAN complains +- gfs2: Don't call dlm after protocol is unmounted +- kselftest/arm64: pac: Fix skipping of tests on systems without PAC +- kselftest/arm64: mte: Fix misleading output when skipping tests +- net: Fix offloading indirect devices dependency on qdisc order creation +- staging: rts5208: Fix get_ms_information() heap buffer size +- hwmon: (pmbus/ibm-cffps) Fix write bits for LED control +- selftests/bpf: Fix flaky send_signal test +- rpc: fix gss_svc_init cleanup on failure +- tcp: enable data-less, empty-cookie SYN with TFO_SERVER_COOKIE_NOT_REQD +- iomap: pass writeback errors to the mapping +- serial: sh-sci: fix break handling for sysrq +- opp: Don't print an error if required-opps is missing +- Bluetooth: Fix handling of LE Enhanced Connection Complete +- nvme: code command_id with a genctr for use-after-free validation +- nvme-tcp: don't check blk_mq_tag_to_rq when receiving pdu data +- arm64: dts: ls1046a: fix eeprom entries +- arm64: tegra: Fix compatible string for Tegra132 CPUs +- ARM: tegra: tamonten: Fix UART pad setting +- ARM: tegra: acer-a500: Remove bogus USB VBUS regulators +- mac80211: Fix monitor MTU limit so that A-MSDUs get through +- drm/display: fix possible null-pointer dereference in dcn10_set_clock() +- gpu: drm: amd: amdgpu: amdgpu_i2c: fix possible uninitialized-variable access in amdgpu_i2c_router_select_ddc_port() +- net/mlx5: Fix variable type to match 64bit +- drm/msm/dp: return correct edid checksum after corrupted edid checksum read +- Bluetooth: avoid circular locks in sco_sock_connect +- Bluetooth: schedule SCO timeouts with delayed_work +- drm/vmwgfx: fix potential UAF in vmwgfx_surface.c +- selftests/bpf: Fix xdp_tx.c prog section name +- drm/amd/display: fix incorrect CM/TF programming sequence in dwb +- drm/amd/display: fix missing writeback disablement if plane is removed +- thunderbolt: Fix port linking by checking all adapters +- drm: xlnx: zynqmp: release reset to DP controller before accessing DP registers +- drm: xlnx: zynqmp_dpsub: Call pm_runtime_get_sync before setting pixel clock +- drm/msm/dsi: Fix DSI and DSI PHY regulator config from SDM660 +- drm/msm: mdp4: drop vblank get/put from prepare/complete_commit +- net: ethernet: stmmac: Do not use unreachable() in ipq806x_gmac_probe() +- nvmem: qfprom: Fix up qfprom_disable_fuse_blowing() ordering +- arm64: dts: qcom: sm8250: Fix epss_l3 unit address +- arm64: dts: qcom: msm8996: don't use underscore in node name +- arm64: dts: qcom: msm8994: don't use underscore in node name +- arm64: dts: qcom: sdm630: don't use underscore in node name +- arm64: dts: qcom: ipq6018: drop '0x' from unit address +- arm64: dts: qcom: sdm660: use reg value for memory node +- arm64: dts: qcom: ipq8074: fix pci node reg property +- ARM: dts: imx53-ppd: Fix ACHC entry +- serial: 8250_omap: Handle optional overrun-throttle-ms property +- arm64: dts: qcom: sdm630: Fix TLMM node and pinctrl configuration +- arm64: dts: qcom: sdm630: Rewrite memory map +- gfs2: Fix glock recursion in freeze_go_xmote_bh +- media: tegra-cec: Handle errors of clk_prepare_enable() +- media: TDA1997x: fix tda1997x_query_dv_timings() return value +- media: v4l2-dv-timings.c: fix wrong condition in two for-loops +- media: imx258: Limit the max analogue gain to 480 +- media: imx258: Rectify mismatch of VTS value +- ASoC: Intel: update sof_pcm512x quirks +- ASoC: Intel: bytcr_rt5640: Move "Platform Clock" routes to the maps for the matching in-/output +- arm64: tegra: Fix Tegra194 PCIe EP compatible string +- ARM: dts: at91: use the right property for shutdown controller +- bonding: 3ad: fix the concurrency between __bond_release_one() and bond_3ad_state_machine_handler() +- ARM: dts: stm32: Update AV96 adv7513 node per dtbs_check +- ARM: dts: stm32: Set {bitclock,frame}-master phandles on ST DKx +- ARM: dts: stm32: Set {bitclock,frame}-master phandles on DHCOM SoM +- workqueue: Fix possible memory leaks in wq_numa_init() +- Bluetooth: skip invalid hci_sync_conn_complete_evt +- ata: sata_dwc_460ex: No need to call phy_exit() befre phy_init() +- libbpf: Fix race when pinning maps in parallel +- samples: bpf: Fix tracex7 error raised on the missing argument +- staging: ks7010: Fix the initialization of the 'sleep_status' structure +- serial: 8250_pci: make setup_port() parameters explicitly unsigned +- hvsi: don't panic on tty_register_driver failure +- xtensa: ISS: don't panic in rs_init +- serial: 8250: Define RX trigger levels for OxSemi 950 devices +- s390: make PCI mio support a machine flag +- s390/jump_label: print real address in a case of a jump label bug +- flow_dissector: Fix out-of-bounds warnings +- ipv4: ip_output.c: Fix out-of-bounds warning in ip_copy_addrs() +- video: fbdev: riva: Error out if 'pixclock' equals zero +- video: fbdev: kyro: Error out if 'pixclock' equals zero +- video: fbdev: asiliantfb: Error out if 'pixclock' equals zero +- arm64: dts: allwinner: h6: tanix-tx6: Fix regulator node names +- drm/bridge: nwl-dsi: Avoid potential multiplication overflow on 32-bit +- bpf/tests: Do not PASS tests without actually testing the result +- bpf/tests: Fix copy-and-paste error in double word test +- drm/amd/amdgpu: Update debugfs link_settings output link_rate field in hex +- drm/amdgpu: Fix a printing message +- ethtool: improve compat ioctl handling +- nfp: fix return statement in nfp_net_parse_meta() +- media: atomisp: pci: fix error return code in atomisp_pci_probe() +- media: atomisp: Fix runtime PM imbalance in atomisp_pci_probe +- media: platform: stm32: unprepare clocks at handling errors in probe +- media: hantro: vp8: Move noisy WARN_ON to vpu_debug +- drm/amd/display: Fix timer_per_pixel unit error +- selftests: firmware: Fix ignored return val of asprintf() warn +- bus: fsl-mc: fix mmio base address for child DPRCs +- tty: serial: jsm: hold port lock when reporting modem line changes +- staging: board: Fix uninitialized spinlock when attaching genpd +- usb: gadget: composite: Allow bMaxPower=0 if self-powered +- USB: EHCI: ehci-mv: improve error handling in mv_ehci_enable() +- usb: gadget: u_ether: fix a potential null pointer dereference +- usb: host: fotg210: fix the actual_length of an iso packet +- usb: host: fotg210: fix the endpoint's transactional opportunities calculation +- igc: Check if num of q_vectors is smaller than max before array access +- rcu: Fix macro name CONFIG_TASKS_RCU_TRACE +- drm: protect drm_master pointers in drm_lease.c +- drm: serialize drm_file.master with a new spinlock +- drm: avoid blocking in drm_clients_info's rcu section +- Smack: Fix wrong semantics in smk_access_entry() +- netlink: Deal with ESRCH error in nlmsg_notify() +- video: fbdev: kyro: fix a DoS bug by restricting user input +- ARM: dts: qcom: apq8064: correct clock names +- iavf: fix locking of critical sections +- iavf: do not override the adapter state in the watchdog task +- iio: dac: ad5624r: Fix incorrect handling of an optional regulator. +- net: phy: Fix data type in DP83822 dp8382x_disable_wol() +- tipc: keep the skb in rcv queue until the whole data is read +- PCI: Use pci_update_current_state() in pci_enable_device_flags() +- crypto: mxs-dcp - Use sg_mapping_iter to copy data +- x86/hyperv: fix for unwanted manipulation of sched_clock when TSC marked unstable +- libbpf: Fix reuse of pinned map on older kernel +- media: dib8000: rewrite the init prbs logic +- ASoC: atmel: ATMEL drivers don't need HAS_DMA +- drm/amdgpu: Fix amdgpu_ras_eeprom_init() +- drm/vc4: hdmi: Set HD_CTL_WHOLSMP and HD_CTL_CHALIGN_SET +- userfaultfd: prevent concurrent API initialization +- kbuild: Fix 'no symbols' warning when CONFIG_TRIM_UNUSD_KSYMS=y +- MIPS: Malta: fix alignment of the devicetree buffer +- f2fs: should put a page beyond EOF when preparing a write +- f2fs: deallocate compressed pages when error happens +- f2fs: fix to unmap pages from userspace process in punch_hole() +- f2fs: fix unexpected ENOENT comes from f2fs_map_blocks() +- f2fs: fix to account missing .skipped_gc_rwsem +- soc: mediatek: cmdq: add address shift in jump +- KVM: PPC: Fix clearing never mapped TCEs in realmode +- clk: at91: clk-generated: Limit the requested rate to our range +- fscache: Fix cookie key hashing +- RDMA/hns: Fix QP's resp incomplete assignment +- powerpc/smp: Update cpu_core_map on all PowerPc systems +- platform/x86: dell-smbios-wmi: Add missing kfree in error-exit from run_smbios_call +- KVM: PPC: Book3S HV Nested: Reflect guest PMU in-use to L0 when guest SPRs are live +- scsi: ufs: ufs-exynos: Fix static checker warning +- KVM: PPC: Book3S HV: Fix copy_tofrom_guest routines +- clk: imx8m: fix clock tree update of TF-A managed clocks +- HID: i2c-hid: Fix Elan touchpad regression +- iommu/vt-d: Update the virtual command related registers +- powerpc/config: Renable MTD_PHYSMAP_OF +- scsi: qedf: Fix error codes in qedf_alloc_global_queues() +- scsi: qedi: Fix error codes in qedi_alloc_global_queues() +- scsi: smartpqi: Fix an error code in pqi_get_raid_map() +- powerpc/numa: Consider the max NUMA node for migratable LPAR +- pinctrl: single: Fix error return code in pcs_parse_bits_in_pinctrl_entry() +- scsi: fdomain: Fix error return code in fdomain_probe() +- sunrpc: Fix return value of get_srcport() +- SUNRPC query transport's source port +- SUNRPC/xprtrdma: Fix reconnection locking +- SUNRPC: Fix potential memory corruption +- NFSv4/pnfs: The layout barrier indicate a minimal value for the seqid +- NFSv4/pNFS: Always allow update of a zero valued layout barrier +- NFSv4/pNFS: Fix a layoutget livelock loop +- dma-debug: fix debugfs initialization order +- openrisc: don't printk() unconditionally +- f2fs: reduce the scope of setting fsck tag when de->name_len is zero +- cpuidle: pseries: Mark pseries_idle_proble() as __init +- RDMA/mlx5: Delete not-available udata check +- RDMA/efa: Remove double QP type assignment +- powerpc/stacktrace: Include linux/delay.h +- cpuidle: pseries: Fixup CEDE0 latency only for POWER10 onwards +- scsi: ufs: Fix memory corruption by ufshcd_read_desc_param() +- vfio: Use config not menuconfig for VFIO_NOIOMMU +- pinctrl: samsung: Fix pinctrl bank pin count +- scsi: BusLogic: Use %X for u32 sized integer rather than %lX +- docs: Fix infiniband uverbs minor number +- RDMA/iwcm: Release resources if iw_cm module initialization fails +- IB/hfi1: Adjust pkey entry in index 0 +- clk: rockchip: drop GRF dependency for rk3328/rk3036 pll types +- scsi: bsg: Remove support for SCSI_IOCTL_SEND_COMMAND +- pinctrl: armada-37xx: Correct PWM pins definitions +- pinctrl: remove empty lines in pinctrl subsystem +- f2fs: quota: fix potential deadlock +- HID: input: do not report stylus battery state as "full" +- PCI: aardvark: Fix masking and unmasking legacy INTx interrupts +- PCI: aardvark: Fix checking for PIO status +- PCI: Export pci_pio_to_address() for module use +- PCI: aardvark: Configure PCIe resources from 'ranges' DT property +- PCI: xilinx-nwl: Enable the clock through CCF +- PCI: Return ~0 data on pciconfig_read() CAP_SYS_ADMIN failure +- PCI: Restrict ASMedia ASM1062 SATA Max Payload Size Supported +- PCI/portdrv: Enable Bandwidth Notification only if port supports it +- f2fs: fix to do sanity check for sb/cp fields correctly +- ARM: 9105/1: atags_to_fdt: don't warn about stack size +- libata: add ATA_HORKAGE_NO_NCQ_TRIM for Samsung 860 and 870 SSDs +- dmaengine: imx-sdma: remove duplicated sdma_load_context +- Revert "dmaengine: imx-sdma: refine to load context only once" +- s390/qdio: cancel the ESTABLISH ccw after timeout +- s390/qdio: fix roll-back after timeout on ESTABLISH ccw +- media: rc-loopback: return number of emitters rather than error +- media: uvc: don't do DMA on stack +- VMCI: fix NULL pointer dereference when unmapping queue pair +- crypto: ccp - shutdown SEV firmware on kexec +- dm crypt: Avoid percpu_counter spinlock contention in crypt_page_alloc() +- power: supply: max17042: handle fails of reading status register +- block: bfq: fix bfq_set_next_ioprio_data() +- crypto: public_key: fix overflow during implicit conversion +- wcn36xx: Ensure finish scan is not requested before start scan +- iio: ltc2983: fix device probe +- arm64: head: avoid over-mapping in map_memory +- arm64: mm: Fix TLBI vs ASID rollover +- soc: aspeed: p2a-ctrl: Fix boundary check for mmap +- soc: aspeed: lpc-ctrl: Fix boundary check for mmap +- soc: qcom: aoss: Fix the out of bound usage of cooling_devs +- pinctrl: ingenic: Fix incorrect pull up/down info +- pinctrl: stmfx: Fix hazardous u8[] to unsigned long cast +- clk: socfpga: agilex: add the bypass register for s2f_usr0 clock +- clk: socfpga: agilex: fix up s2f_user0_clk representation +- clk: socfpga: agilex: fix the parents of the psi_ref_clk +- tools/thermal/tmon: Add cross compiling support +- selftests/ftrace: Fix requirement check of README file +- ceph: fix dereference of null pointer cf +- 9p/xen: Fix end of loop tests for list_for_each_entry +- xen: fix setting of max_pfn in shared_info +- powerpc/perf/hv-gpci: Fix counter value parsing +- PCI/MSI: Skip masking MSI-X on Xen PV +- blk-zoned: allow BLKREPORTZONE without CAP_SYS_ADMIN +- blk-zoned: allow zone management send operations without CAP_SYS_ADMIN +- btrfs: reset replace target device to allocation state on close +- btrfs: wake up async_delalloc_pages waiters after submit +- io-wq: fix wakeup race when adding new work +- io_uring: fail links of cancelled timeouts +- io_uring: add ->splice_fd_in checks +- io_uring: place fixed tables under memcg limits +- io_uring: limit fixed table size by RLIMIT_NOFILE +- rtc: tps65910: Correct driver module alias +- ext4: flush s_error_work before journal destroy in ext4_fill_super +- crypto: ccp - fix resource leaks in ccp_run_aes_gcm_cmd() +- make OPTIMIZE_INLINING config editable +- bpf: Fix integer overflow in prealloc_elems_and_freelist() +- iommu/vt-d: Fix clearing real DMA device's scalable-mode context entries +- iommu/vt-d: Global devTLB flush when present context entry changed +- mm: slub: fix slub_debug disabling for list of slabs +- mm: vmscan: fix missing psi annotation for node_reclaim() +- ipc: replace costly bailout check in sysvipc_find_ipc() +- bpf, mips: Validate conditional branch offsets +- ARM: Qualify enabling of swiotlb_init() +- arm64: mm: account for hotplug memory when randomizing the linear region +- blk-mq-sched: Fix blk_mq_sched_alloc_tags() error handling +- disable OPTIMIZE_INLINING by default +- Revert "compiler: remove CONFIG_OPTIMIZE_INLINING entirely" +- ARM: Support KFENCE for ARM +- ARM: mm: Provide is_write_fault() +- ARM: mm: Provide set_memory_valid() +- kfence: show cpu and timestamp in alloc/free info +- kfence: test: fail fast if disabled at boot +- slub: force on no_hash_pointers when slub_debug is enabled +- printk: clarify the documentation for plain pointer printing +- lib/vsprintf: do not show no_hash_pointers message multiple times +- kfence: add function to mask address bits +- kfence, x86: only define helpers if !MODULE +- kfence: fix is_kfence_address() for addresses below KFENCE_POOL_SIZE +- kfence: skip all GFP_ZONEMASK allocations +- kfence: move the size check to the beginning of __kfence_alloc() +- kfence: defer kfence_test_init to ensure that kunit debugfs is created +- kfence: unconditionally use unbound work queue +- mm, slub: change run-time assertion in kmalloc_index() to compile-time +- kfence: use TASK_IDLE when awaiting allocation +- arm64: mm: don't use CON and BLK mapping if KFENCE is enabled +- kfence: use power-efficient work queue to run delayed work +- kfence: maximize allocation wait timeout duration +- kfence: await for allocation using wait_event +- kfence: zero guard page after out-of-bounds access +- powerpc: Enable KFENCE for PPC32 +- powerpc/32s: Always map kernel text and rodata with BATs +- kfence, x86: fix preemptible warning on KPTI-enabled systems +- kfence: make compatible with kmemleak +- kfence: fix reports if constant function prefixes exist +- kfence, slab: fix cache_alloc_debugcheck_after() for bulk allocations +- kfence: fix printk format for ptrdiff_t +- kasan: use error_report_end tracepoint +- kfence: use error_report_end tracepoint +- tracing: add error_report_end trace point +- kfence: report sensitive information based on no_hash_pointers +- lib/vsprintf: no_hash_pointers prints all addresses as unhashed +- kselftest: add support for skipped tests +- lib: use KSTM_MODULE_GLOBALS macro in kselftest drivers +- MAINTAINERS: add entry for KFENCE +- kfence: add test suite +- kfence, Documentation: add KFENCE documentation +- kfence, kasan: make KFENCE compatible with KASAN +- mm, kfence: insert KFENCE hooks for SLUB +- mm, kfence: insert KFENCE hooks for SLAB +- kfence: use pt_regs to generate stack trace on faults +- arm64, kfence: enable KFENCE for ARM64 +- x86, kfence: enable KFENCE for x86 +- mm: add Kernel Electric-Fence infrastructure + +* Tue Oct 19 2021 Zheng Zengkai - 5.10.0-14.0.0.4 +- Revert "time: Handle negative seconds correctly in timespec64_to_ns()" +- Revert "posix-cpu-timers: Force next expiration recalc after itimer reset" +- Revert "block: nbd: add sanity check for first_minor" +- Revert "Bluetooth: Move shutdown callback before flushing tx and rx queue" +- clk: kirkwood: Fix a clocking boot regression +- backlight: pwm_bl: Improve bootloader/kernel device handover +- fbmem: don't allow too huge resolutions +- IMA: remove the dependency on CRYPTO_MD5 +- IMA: remove -Wmissing-prototypes warning +- fuse: flush extending writes +- fuse: truncate pagecache on atomic_o_trunc +- ARM: dts: at91: add pinctrl-{names, 0} for all gpios +- KVM: nVMX: Unconditionally clear nested.pi_pending on nested VM-Enter +- KVM: VMX: avoid running vmx_handle_exit_irqoff in case of emulation +- KVM: x86: Update vCPU's hv_clock before back to guest when tsc_offset is adjusted +- KVM: s390: index kvm->arch.idle_mask by vcpu_idx +- Revert "KVM: x86: mmu: Add guest physical address check in translate_gpa()" +- x86/resctrl: Fix a maybe-uninitialized build warning treated as error +- perf/x86/amd/ibs: Extend PERF_PMU_CAP_NO_EXCLUDE to IBS Op +- tty: Fix data race between tiocsti() and flush_to_ldisc() +- bio: fix page leak bio_add_hw_page failure +- io_uring: IORING_OP_WRITE needs hash_reg_file set +- time: Handle negative seconds correctly in timespec64_to_ns() +- f2fs: guarantee to write dirty data when enabling checkpoint back +- iwlwifi Add support for ax201 in Samsung Galaxy Book Flex2 Alpha +- ASoC: rt5682: Remove unused variable in rt5682_i2c_remove() +- ipv4: fix endianness issue in inet_rtm_getroute_build_skb() +- octeontx2-af: Set proper errorcode for IPv4 checksum errors +- octeontx2-af: Fix static code analyzer reported issues +- octeontx2-af: Fix loop in free and unmap counter +- net: qualcomm: fix QCA7000 checksum handling +- net: sched: Fix qdisc_rate_table refcount leak when get tcf_block failed +- ipv4: make exception cache less predictible +- ipv6: make exception cache less predictible +- brcmfmac: pcie: fix oops on failure to resume and reprobe +- bcma: Fix memory leak for internally-handled cores +- atlantic: Fix driver resume flow. +- ath6kl: wmi: fix an error code in ath6kl_wmi_sync_point() +- ice: Only lock to update netdev dev_addr +- iwlwifi: skip first element in the WTAS ACPI table +- iwlwifi: follow the new inclusive terminology +- ASoC: wcd9335: Disable irq on slave ports in the remove function +- ASoC: wcd9335: Fix a memory leak in the error handling path of the probe function +- ASoC: wcd9335: Fix a double irq free in the remove function +- tty: serial: fsl_lpuart: fix the wrong mapbase value +- usb: bdc: Fix a resource leak in the error handling path of 'bdc_probe()' +- usb: bdc: Fix an error handling path in 'bdc_probe()' when no suitable DMA config is available +- usb: ehci-orion: Handle errors of clk_prepare_enable() in probe +- i2c: xlp9xx: fix main IRQ check +- i2c: mt65xx: fix IRQ check +- CIFS: Fix a potencially linear read overflow +- bpf: Fix possible out of bound write in narrow load handling +- mmc: moxart: Fix issue with uninitialized dma_slave_config +- mmc: dw_mmc: Fix issue with uninitialized dma_slave_config +- mmc: sdhci: Fix issue with uninitialized dma_slave_config +- ASoC: Intel: Skylake: Fix module resource and format selection +- ASoC: Intel: Skylake: Leave data as is when invoking TLV IPCs +- ASoC: Intel: kbl_da7219_max98927: Fix format selection for max98373 +- rsi: fix an error code in rsi_probe() +- rsi: fix error code in rsi_load_9116_firmware() +- gfs2: init system threads before freeze lock +- i2c: hix5hd2: fix IRQ check +- i2c: fix platform_get_irq.cocci warnings +- i2c: s3c2410: fix IRQ check +- i2c: iop3xx: fix deferred probing +- Bluetooth: add timeout sanity check to hci_inquiry +- lkdtm: replace SCSI_DISPATCH_CMD with SCSI_QUEUE_RQ +- mm/swap: consider max pages in iomap_swapfile_add_extent +- usb: gadget: mv_u3d: request_irq() after initializing UDC +- firmware: raspberrypi: Fix a leak in 'rpi_firmware_get()' +- firmware: raspberrypi: Keep count of all consumers +- i2c: synquacer: fix deferred probing +- clk: staging: correct reference to config IOMEM to config HAS_IOMEM +- arm64: dts: marvell: armada-37xx: Extend PCIe MEM space +- nfsd4: Fix forced-expiry locking +- lockd: Fix invalid lockowner cast after vfs_test_lock +- locking/local_lock: Add missing owner initialization +- locking/lockdep: Mark local_lock_t +- mac80211: Fix insufficient headroom issue for AMSDU +- libbpf: Re-build libbpf.so when libbpf.map changes +- usb: phy: tahvo: add IRQ check +- usb: host: ohci-tmio: add IRQ check +- PM: cpu: Make notifier chain use a raw_spinlock_t +- Bluetooth: Move shutdown callback before flushing tx and rx queue +- samples: pktgen: add missing IPv6 option to pktgen scripts +- devlink: Clear whole devlink_flash_notify struct +- selftests/bpf: Fix test_core_autosize on big-endian machines +- usb: gadget: udc: renesas_usb3: Fix soc_device_match() abuse +- usb: phy: twl6030: add IRQ checks +- usb: phy: fsl-usb: add IRQ check +- usb: gadget: udc: s3c2410: add IRQ check +- usb: gadget: udc: at91: add IRQ check +- usb: dwc3: qcom: add IRQ check +- usb: dwc3: meson-g12a: add IRQ check +- ASoC: rt5682: Properly turn off regulators if wrong device ID +- ASoC: rt5682: Implement remove callback +- net/mlx5: Fix unpublish devlink parameters +- net/mlx5: Register to devlink ingress VLAN filter trap +- drm/msm/dsi: Fix some reference counted resource leaks +- Bluetooth: fix repeated calls to sco_sock_kill +- ASoC: Intel: Fix platform ID matching +- cgroup/cpuset: Fix violation of cpuset locking rule +- cgroup/cpuset: Miscellaneous code cleanup +- counter: 104-quad-8: Return error when invalid mode during ceiling_write +- arm64: dts: exynos: correct GIC CPU interfaces address range on Exynos7 +- drm/msm/dpu: make dpu_hw_ctl_clear_all_blendstages clear necessary LMs +- drm/msm/mdp4: move HW revision detection to earlier phase +- drm/msm/mdp4: refactor HW revision detection into read_mdp_hw_revision +- selftests/bpf: Fix bpf-iter-tcp4 test to print correctly the dest IP +- PM: EM: Increase energy calculation precision +- Bluetooth: increase BTNAMSIZ to 21 chars to fix potential buffer overflow +- debugfs: Return error during {full/open}_proxy_open() on rmmod +- soc: qcom: smsm: Fix missed interrupts if state changes while masked +- bpf, samples: Add missing mprog-disable to xdp_redirect_cpu's optstring +- PCI: PM: Enable PME if it can be signaled from D3cold +- PCI: PM: Avoid forcing PCI_D0 for wakeup reasons inconsistently +- media: venus: venc: Fix potential null pointer dereference on pointer fmt +- media: em28xx-input: fix refcount bug in em28xx_usb_disconnect +- leds: trigger: audio: Add an activate callback to ensure the initial brightness is set +- leds: lt3593: Put fwnode in any case during ->probe() +- i2c: highlander: add IRQ check +- net/mlx5: Fix missing return value in mlx5_devlink_eswitch_inline_mode_set() +- devlink: Break parameter notification sequence to be before/after unload/load driver +- arm64: dts: renesas: hihope-rzg2-ex: Add EtherAVB internal rx delay +- arm64: dts: renesas: rzg2: Convert EtherAVB to explicit delay handling +- Bluetooth: mgmt: Fix wrong opcode in the response for add_adv cmd +- net: cipso: fix warnings in netlbl_cipsov4_add_std +- drm: mxsfb: Clear FIFO_CLEAR bit +- drm: mxsfb: Increase number of outstanding requests on V4 and newer HW +- drm: mxsfb: Enable recovery on underflow +- cgroup/cpuset: Fix a partition bug with hotplug +- net/mlx5e: Block LRO if firmware asks for tunneled LRO +- net/mlx5e: Prohibit inner indir TIRs in IPoIB +- ARM: dts: meson8b: ec100: Fix the pwm regulator supply properties +- ARM: dts: meson8b: mxq: Fix the pwm regulator supply properties +- ARM: dts: meson8b: odroidc1: Fix the pwm regulator supply properties +- ARM: dts: meson8: Use a higher default GPU clock frequency +- tcp: seq_file: Avoid skipping sk during tcp_seek_last_pos +- drm/amdgpu/acp: Make PM domain really work +- 6lowpan: iphc: Fix an off-by-one check of array index +- Bluetooth: sco: prevent information leak in sco_conn_defer_accept() +- media: atomisp: fix the uninitialized use and rename "retvalue" +- media: coda: fix frame_mem_ctrl for YUV420 and YVU420 formats +- media: rockchip/rga: fix error handling in probe +- media: rockchip/rga: use pm_runtime_resume_and_get() +- media: go7007: remove redundant initialization +- media: go7007: fix memory leak in go7007_usb_probe +- media: dvb-usb: Fix error handling in dvb_usb_i2c_init +- media: dvb-usb: fix uninit-value in vp702x_read_mac_addr +- media: dvb-usb: fix uninit-value in dvb_usb_adapter_dvb_init +- ionic: cleanly release devlink instance +- driver core: Fix error return code in really_probe() +- firmware: fix theoretical UAF race with firmware cache and resume +- gfs2: Fix memory leak of object lsi on error return path +- libbpf: Fix removal of inner map in bpf_object__create_map +- soc: qcom: rpmhpd: Use corner in power_off +- i40e: improve locking of mac_filter_hash +- arm64: dts: renesas: r8a77995: draak: Remove bogus adv7511w properties +- ARM: dts: aspeed-g6: Fix HVI3C function-group in pinctrl dtsi +- libbpf: Fix the possible memory leak on error +- gve: fix the wrong AdminQ buffer overflow check +- drm/of: free the iterator object on failure +- bpf: Fix potential memleak and UAF in the verifier. +- bpf: Fix a typo of reuseport map in bpf.h. +- drm/of: free the right object +- media: cxd2880-spi: Fix an error handling path +- soc: rockchip: ROCKCHIP_GRF should not default to y, unconditionally +- leds: is31fl32xx: Fix missing error code in is31fl32xx_parse_dt() +- media: TDA1997x: enable EDID support +- ASoC: mediatek: mt8183: Fix Unbalanced pm_runtime_enable in mt8183_afe_pcm_dev_probe +- drm/gma500: Fix end of loop tests for list_for_each_entry +- drm/panfrost: Fix missing clk_disable_unprepare() on error in panfrost_clk_init() +- EDAC/i10nm: Fix NVDIMM detection +- spi: spi-zynq-qspi: use wait_for_completion_timeout to make zynq_qspi_exec_mem_op not interruptible +- spi: sprd: Fix the wrong WDG_LOAD_VAL +- regulator: vctrl: Avoid lockdep warning in enable/disable ops +- regulator: vctrl: Use locked regulator_get_voltage in probe path +- blk-crypto: fix check for too-large dun_bytes +- spi: davinci: invoke chipselect callback +- x86/mce: Defer processing of early errors +- tpm: ibmvtpm: Avoid error message when process gets signal while waiting +- certs: Trigger creation of RSA module signing key if it's not an RSA key +- crypto: qat - use proper type for vf_mask +- irqchip/gic-v3: Fix priority comparison when non-secure priorities are used +- spi: coldfire-qspi: Use clk_disable_unprepare in the remove function +- block: nbd: add sanity check for first_minor +- clocksource/drivers/sh_cmt: Fix wrong setting if don't request IRQ for clock source channel +- lib/mpi: use kcalloc in mpi_resize +- irqchip/loongson-pch-pic: Improve edge triggered interrupt support +- genirq/timings: Fix error return code in irq_timings_test_irqs() +- spi: spi-pic32: Fix issue with uninitialized dma_slave_config +- spi: spi-fsl-dspi: Fix issue with uninitialized dma_slave_config +- block: return ELEVATOR_DISCARD_MERGE if possible +- m68k: Fix invalid RMW_INSNS on CPUs that lack CAS +- rcu: Fix stall-warning deadlock due to non-release of rcu_node ->lock +- rcu: Add lockdep_assert_irqs_disabled() to rcu_sched_clock_irq() and callees +- rcu: Fix to include first blocked task in stall warning +- sched: Fix UCLAMP_FLAG_IDLE setting +- sched/numa: Fix is_core_idle() +- m68k: emu: Fix invalid free in nfeth_cleanup() +- power: supply: cw2015: use dev_err_probe to allow deferred probe +- s390/ap: fix state machine hang after failure to enable irq +- s390/debug: fix debug area life cycle +- s390/debug: keep debug data on resize +- s390/pci: fix misleading rc in clp_set_pci_fn() +- s390/kasan: fix large PMD pages address alignment check +- udf_get_extendedattr() had no boundary checks. +- fcntl: fix potential deadlock for &fasync_struct.fa_lock +- crypto: qat - do not export adf_iov_putmsg() +- crypto: qat - fix naming for init/shutdown VF to PF notifications +- crypto: qat - fix reuse of completion variable +- crypto: qat - handle both source of interrupt in VF ISR +- crypto: qat - do not ignore errors from enable_vf2pf_comms() +- crypto: omap - Fix inconsistent locking of device lists +- libata: fix ata_host_start() +- s390/zcrypt: fix wrong offset index for APKA master key valid state +- s390/cio: add dev_busid sysfs entry for each subchannel +- power: supply: max17042_battery: fix typo in MAx17042_TOFF +- power: supply: smb347-charger: Add missing pin control activation +- nvmet: pass back cntlid on successful completion +- nvme-rdma: don't update queue count when failing to set io queues +- nvme-tcp: don't update queue count when failing to set io queues +- blk-throtl: optimize IOPS throttle for large IO scenarios +- bcache: add proper error unwinding in bcache_device_init +- isofs: joliet: Fix iocharset=utf8 mount option +- udf: Fix iocharset=utf8 mount option +- udf: Check LVID earlier +- hrtimer: Ensure timerfd notification for HIGHRES=n +- hrtimer: Avoid double reprogramming in __hrtimer_start_range_ns() +- posix-cpu-timers: Force next expiration recalc after itimer reset +- EDAC/mce_amd: Do not load edac_mce_amd module on guests +- rcu/tree: Handle VM stoppage in stall detection +- sched/deadline: Fix missing clock update in migrate_task_rq_dl() +- crypto: omap-sham - clear dma flags only after omap_sham_update_dma_stop() +- power: supply: axp288_fuel_gauge: Report register-address on readb / writeb errors +- sched/deadline: Fix reset_on_fork reporting of DL tasks +- crypto: mxs-dcp - Check for DMA mapping errors +- regulator: tps65910: Silence deferred probe error +- regmap: fix the offset of register error log +- locking/mutex: Fix HANDOFF condition +- PCI: Call Max Payload Size-related fixup quirks early +- x86/reboot: Limit Dell Optiplex 990 quirk to early BIOS versions +- xhci: fix unsafe memory usage in xhci tracing +- xhci: fix even more unsafe memory usage in xhci tracing +- usb: mtu3: fix the wrong HS mult value +- usb: mtu3: use @mult for HS isoc or intr +- usb: mtu3: restore HS function when set SS/SSP +- usb: gadget: tegra-xudc: fix the wrong mult value for HS isoc or intr +- usb: host: xhci-rcar: Don't reload firmware after the completion +- ALSA: usb-audio: Add registration quirk for JBL Quantum 800 +- blk-mq: clearing flush request reference in tags->rqs[] +- netfilter: nftables: clone set element expression template +- netfilter: nf_tables: initialize set before expression setup +- blk-mq: fix is_flush_rq +- blk-mq: fix kernel panic during iterating over flush request +- x86/events/amd/iommu: Fix invalid Perf result due to IOMMU PMC power-gating +- Revert "r8169: avoid link-up interrupt issue on RTL8106e if user enables ASPM" +- tty: drop termiox user definitions +- net: linux/skbuff.h: combine SKB_EXTENSIONS + KCOV handling +- serial: 8250: 8250_omap: Fix unused variable warning +- net: kcov: don't select SKB_EXTENSIONS when there is no NET +- net: ll_temac: Remove left-over debug message +- USB: serial: mos7720: improve OOM-handling in read_mos_reg() +- livepatch: Adapt livepatch-sample for stop_machine model +- livepatch: Add klp_{register,unregister}_patch for stop_machine model +- media: stkwebcam: fix memory leak in stk_camera_probe +- fuse: fix illegal access to inode with reused nodeid +- new helper: inode_wrong_type() +- spi: Switch to signed types for *_native_cs SPI controller fields +- ALSA: pcm: fix divide error in snd_pcm_lib_ioctl +- ALSA: hda/realtek: Workaround for conflicting SSID on ASUS ROG Strix G17 +- ALSA: hda/realtek: Quirk for HP Spectre x360 14 amp setup +- cryptoloop: add a deprecation warning +- perf/x86/amd/power: Assign pmu.module +- perf/x86/amd/ibs: Work around erratum #1197 +- ceph: fix possible null-pointer dereference in ceph_mdsmap_decode() +- perf/x86/intel/pt: Fix mask of num_address_ranges +- qede: Fix memset corruption +- net: macb: Add a NULL check on desc_ptp +- qed: Fix the VF msix vectors flow +- reset: reset-zynqmp: Fixed the argument data type +- gpu: ipu-v3: Fix i.MX IPU-v3 offset calculations for (semi)planar U/V formats +- ARM: OMAP1: ams-delta: remove unused function ams_delta_camera_power +- xtensa: fix kconfig unmet dependency warning for HAVE_FUTEX_CMPXCHG +- static_call: Fix unused variable warn w/o MODULE +- Revert "Add a reference to ucounts for each cred" +- Revert "cred: add missing return error code when set_cred_ucounts() failed" +- Revert "ucounts: Increase ucounts reference counter before the security hook" +- ubifs: report correct st_size for encrypted symlinks +- f2fs: report correct st_size for encrypted symlinks +- ext4: report correct st_size for encrypted symlinks +- fscrypt: add fscrypt_symlink_getattr() for computing st_size +- bpf: Fix potentially incorrect results with bpf_get_local_storage() +- audit: move put_tree() to avoid trim_trees refcount underflow and UAF +- net: don't unconditionally copy_from_user a struct ifreq for socket ioctls +- Revert "parisc: Add assembly implementations for memset, strlen, strcpy, strncpy and strcat" +- Revert "floppy: reintroduce O_NDELAY fix" +- arm64: dts: qcom: msm8994-angler: Fix gpio-reserved-ranges 85-88 +- lkdtm: Enable DOUBLE_FAULT on all architectures +- net: dsa: mt7530: fix VLAN traffic leaks again +- usb: typec: ucsi: Clear pending after acking connector change +- usb: typec: ucsi: Work around PPM losing change information +- usb: typec: ucsi: acpi: Always decode connector change information +- tracepoint: Use rcu get state and cond sync for static call updates +- srcu: Provide polling interfaces for Tiny SRCU grace periods +- srcu: Make Tiny SRCU use multi-bit grace-period counter +- srcu: Provide internal interface to start a Tiny SRCU grace period +- srcu: Provide polling interfaces for Tree SRCU grace periods +- srcu: Provide internal interface to start a Tree SRCU grace period +- riscv: Fixup patch_text panic in ftrace +- riscv: Fixup wrong ftrace remove cflag +- Bluetooth: btusb: check conditions before enabling USB ALT 3 for WBS +- tipc: call tipc_wait_for_connect only when dlen is not 0 +- mtd: spinand: Fix incorrect parameters for on-die ECC +- pipe: do FASYNC notifications for every pipe IO, not just state changes +- pipe: avoid unnecessary EPOLLET wakeups under normal loads +- btrfs: fix race between marking inode needs to be logged and log syncing +- net/rds: dma_map_sg is entitled to merge entries +- drm/nouveau/kms/nv50: workaround EFI GOP window channel format differences +- drm/nouveau/disp: power down unused DP links during init +- drm: Copy drm_wait_vblank to user before returning +- blk-mq: don't grab rq's refcount in blk_mq_check_expired() +- drm/amd/pm: change the workload type for some cards +- Revert "drm/amd/pm: fix workload mismatch on vega10" +- qed: Fix null-pointer dereference in qed_rdma_create_qp() +- qed: qed ll2 race condition fixes +- tools/virtio: fix build +- vringh: Use wiov->used to check for read/write desc order +- virtio_vdpa: reject invalid vq indices +- virtio_pci: Support surprise removal of virtio pci device +- virtio: Improve vq->broken access to avoid any compiler optimization +- cpufreq: blocklist Qualcomm sm8150 in cpufreq-dt-platdev +- opp: remove WARN when no valid OPPs remain +- iwlwifi: pnvm: accept multiple HW-type TLVs +- clk: renesas: rcar-usb2-clock-sel: Fix kernel NULL pointer dereference +- perf/x86/intel/uncore: Fix integer overflow on 23 bit left shift of a u32 +- dt-bindings: sifive-l2-cache: Fix 'select' matching +- usb: gadget: u_audio: fix race condition on endpoint stop +- drm/i915: Fix syncmap memory leak +- net: stmmac: fix kernel panic due to NULL pointer dereference of plat->est +- net: stmmac: add mutex lock to protect est parameters +- Revert "mmc: sdhci-iproc: Set SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN on BCM2711" +- rtnetlink: Return correct error on changing device netns +- cxgb4: dont touch blocked freelist bitmap after free +- ipv4: use siphash instead of Jenkins in fnhe_hashfun() +- ipv6: use siphash in rt6_exception_hash() +- net/sched: ets: fix crash when flipping from 'strict' to 'quantum' +- ucounts: Increase ucounts reference counter before the security hook +- net: marvell: fix MVNETA_TX_IN_PRGRS bit number +- xgene-v2: Fix a resource leak in the error handling path of 'xge_probe()' +- ip_gre: add validation for csum_start +- RDMA/efa: Free IRQ vectors on error flow +- e1000e: Do not take care about recovery NVM checksum +- e1000e: Fix the max snoop/no-snoop latency for 10M +- igc: Use num_tx_queues when iterating over tx_ring queue +- igc: fix page fault when thunderbolt is unplugged +- net: usb: pegasus: fixes of set_register(s) return value evaluation; +- ice: do not abort devlink info if board identifier can't be found +- RDMA/bnxt_re: Remove unpaired rtnl unlock in bnxt_re_dev_init() +- IB/hfi1: Fix possible null-pointer dereference in _extend_sdma_tx_descs() +- RDMA/bnxt_re: Add missing spin lock initialization +- scsi: core: Fix hang of freezing queue between blocking and running device +- usb: dwc3: gadget: Stop EP0 transfers during pullup disable +- usb: dwc3: gadget: Fix dwc3_calc_trbs_left() +- usb: renesas-xhci: Prefer firmware loading on unknown ROM state +- USB: serial: option: add new VID/PID to support Fibocom FG150 +- Revert "USB: serial: ch341: fix character loss at high transfer rates" +- drm/amdgpu: Cancel delayed work when GFXOFF is disabled +- Revert "btrfs: compression: don't try to compress if we don't have enough pages" +- riscv: Ensure the value of FP registers in the core dump file is up to date +- ceph: correctly handle releasing an embedded cap flush +- can: usb: esd_usb2: esd_usb2_rx_event(): fix the interchange of the CAN RX and TX error counters +- net: mscc: Fix non-GPL export of regmap APIs +- ovl: fix uninitialized pointer read in ovl_lookup_real_one() +- blk-iocost: fix lockdep warning on blkcg->lock +- netfilter: conntrack: collect all entries in one cycle +- ARC: Fix CONFIG_STACKDEPOT +- ASoC: component: Remove misplaced prefix handling in pin control functions +- ASoC: rt5682: Adjust headset volume button threshold +- bpf: Fix NULL pointer dereference in bpf_get_local_storage() helper +- bpf: Fix ringbuf helper function compatibility +- ARM: spectre-v2: turn off the mitigation via boot cmdline param +- ext4: fix potential uninitialized access to retval in kmmpd +- take LOOKUP_{ROOT,ROOT_GRABBED,JUMPED} out of LOOKUP_... space +- switch file_open_root() to struct path +- kyber: introduce kyber_depth_updated() +- perf annotate: Add itrace options support +- mm: Fix the uninitialized use in overcommit_policy_handler +- memcg: enable accounting for ldt_struct objects +- memcg: enable accounting for posix_timers_cache slab +- memcg: enable accounting for signals +- memcg: enable accounting for new namesapces and struct nsproxy +- memcg: enable accounting for fasync_cache +- memcg: enable accounting for mnt_cache entries +- memcg: charge fs_context and legacy_fs_context +- memcg: enable accounting for pids in nested pid namespaces +- blk-mq: fix divide by zero crash in tg_may_dispatch() +- ext4: prevent getting empty inode buffer +- ext4: move ext4_fill_raw_inode() related functions +- ext4: factor out ext4_fill_raw_inode() +- ext4: make the updating inode data procedure atomic +- ext4: move inode eio simulation behind io completeion +- sched: Aware multi-core system for optimize loadtracking +- livepatch: Fix compile warnning +- md: revert io stats accounting +- sched/idle: Reported an error when an illegal negative value is passed +- sched/idle: Optimize the loop time algorithm to reduce multicore disturb +- serial: 8250: 8250_omap: Fix possible array out of bounds access +- once: Fix panic when module unload +- ext4: wipe ext4_dir_entry2 upon file deletion +- livepatch: move arch_klp_mem_recycle after the return value judgment +- livepatch/x86: only check stack top +- livepatch/ppc64: only check stack top +- livepatch/ppc32: only check stack top +- livepatch/arm: only check stack top +- livepatch/arm64: only check stack top +- livepatch: checks only if the replaced instruction is on the stack +- livepatch: Add state describe for force +- blk-mq: clear active_queues before clearing BLK_MQ_F_TAG_QUEUE_SHARED +- sysctl: Refactor IAS framework +- io_uring: ensure symmetry in handling iter types in loop_rw_iter() +- ext4: fix race writing to an inline_data file while its xattrs are changing +- memcg: enable accounting of ipc resources +- vt_kdsetmode: extend console locking +- net: qrtr: fix another OOB Read in qrtr_endpoint_post +- btrfs: fix NULL pointer dereference when deleting device by invalid id +- acpi: acpica: fix acpi parse and parseext cache leaks +- acpi: acpica: fix acpi operand cache leak in dsutils.c +- sctp: add param size validation for SCTP_PARAM_SET_PRIMARY +- sctp: validate chunk size in __rcv_asconf_lookup +- ARM: footbridge: remove personal server platform +- hfs: fix null-ptr-deref in hfs_find_init() +- io_uring: only assign io_uring_enter() SQPOLL error in actual error case +- io_uring: fix xa_alloc_cycle() error return value check +- fs: warn about impending deprecation of mandatory locks +- mm: memcontrol: fix occasional OOMs due to proportional memory.low reclaim +- ASoC: intel: atom: Fix breakage for PCM buffer address setup +- ALSA: hda/realtek: Limit mic boost on HP ProBook 445 G8 +- PCI: Increase D3 delay for AMD Renoir/Cezanne XHCI +- s390/pci: fix use after free of zpci_dev +- ALSA: hda/via: Apply runtime PM workaround for ASUS B23E +- btrfs: prevent rename2 from exchanging a subvol with a directory from different parents +- mmc: sdhci-iproc: Set SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN on BCM2711 +- mmc: sdhci-iproc: Cap min clock frequency on BCM2711 +- ALSA: hda/realtek: Enable 4-speaker output for Dell XPS 15 9510 laptop +- ipack: tpci200: fix memory leak in the tpci200_register +- ipack: tpci200: fix many double free issues in tpci200_pci_probe +- slimbus: ngd: reset dma setup during runtime pm +- slimbus: messaging: check for valid transaction id +- slimbus: messaging: start transaction ids from 1 instead of zero +- tracing / histogram: Fix NULL pointer dereference on strcmp() on NULL event name +- ALSA: hda - fix the 'Capture Switch' value change notifications +- clk: qcom: gdsc: Ensure regulator init state matches GDSC state +- clk: imx6q: fix uart earlycon unwork +- mmc: sdhci-msm: Update the software timeout value for sdhc +- mmc: mmci: stm32: Check when the voltage switch procedure should be done +- mmc: dw_mmc: Fix hang on data CRC error +- Revert "flow_offload: action should not be NULL when it is referenced" +- iavf: Fix ping is lost after untrusted VF had tried to change MAC +- i40e: Fix ATR queue selection +- r8152: fix writing USB_BP2_EN +- iommu/vt-d: Fix incomplete cache flush in intel_pasid_tear_down_entry() +- iommu/vt-d: Consolidate duplicate cache invaliation code +- ovs: clear skb->tstamp in forwarding path +- net: mdio-mux: Handle -EPROBE_DEFER correctly +- net: mdio-mux: Don't ignore memory allocation errors +- sch_cake: fix srchost/dsthost hashing mode +- ixgbe, xsk: clean up the resources in ixgbe_xsk_pool_enable error path +- net: qlcnic: add missed unlock in qlcnic_83xx_flash_read32 +- virtio-net: use NETIF_F_GRO_HW instead of NETIF_F_LRO +- virtio-net: support XDP when not more queues +- vrf: Reset skb conntrack connection on VRF rcv +- bnxt_en: Add missing DMA memory barriers +- bnxt_en: Disable aRFS if running on 212 firmware +- ptp_pch: Restore dependency on PCI +- net: 6pack: fix slab-out-of-bounds in decode_data +- bnxt: count Tx drops +- bnxt: make sure xmit_more + errors does not miss doorbells +- bnxt: disable napi before canceling DIM +- bnxt: don't lock the tx queue from napi poll +- bpf: Clear zext_dst of dead insns +- drm/mediatek: Add AAL output size configuration +- drm/mediatek: Fix aal size config +- soc / drm: mediatek: Move DDP component defines into mtk-mmsys.h +- vdpa/mlx5: Avoid destroying MR on empty iotlb +- vhost: Fix the calculation in vhost_overflow() +- bus: ti-sysc: Fix error handling for sysc_check_active_timer() +- vhost-vdpa: Fix integer overflow in vhost_vdpa_process_iotlb_update() +- virtio: Protect vqs list access +- dccp: add do-while-0 stubs for dccp_pr_debug macros +- cpufreq: armada-37xx: forbid cpufreq for 1.2 GHz variant +- iommu: Check if group is NULL before remove device +- arm64: dts: qcom: msm8992-bullhead: Remove PSCI +- arm64: dts: qcom: c630: fix correct powerdown pin for WSA881x +- Bluetooth: hidp: use correct wait queue when removing ctrl_wait +- drm/amd/display: workaround for hard hang on HPD on native DP +- drm/amd/display: Fix Dynamic bpp issue with 8K30 with Navi 1X +- net: usb: lan78xx: don't modify phy_device state concurrently +- net: usb: pegasus: Check the return value of get_geristers() and friends; +- ARM: dts: nomadik: Fix up interrupt controller node names +- qede: fix crash in rmmod qede while automatic debug collection +- drm/amdgpu: fix the doorbell missing when in CGPG issue for renoir. +- scsi: core: Fix capacity set to zero after offlinining device +- scsi: core: Avoid printing an error if target_alloc() returns -ENXIO +- scsi: scsi_dh_rdac: Avoid crash during rdac_bus_attach() +- scsi: megaraid_mm: Fix end of loop tests for list_for_each_entry() +- scsi: pm80xx: Fix TMF task completion race condition +- dmaengine: of-dma: router_xlate to return -EPROBE_DEFER if controller is not yet available +- ARM: dts: am43x-epos-evm: Reduce i2c0 bus speed for tps65218 +- net: xfrm: Fix end of loop tests for list_for_each_entry +- spi: spi-mux: Add module info needed for autoloading +- dmaengine: usb-dmac: Fix PM reference leak in usb_dmac_probe() +- dmaengine: xilinx_dma: Fix read-after-free bug when terminating transfers +- USB: core: Fix incorrect pipe calculation in do_proc_control() +- USB: core: Avoid WARNings for 0-length descriptor requests +- KVM: X86: Fix warning caused by stale emulation context +- KVM: x86: Factor out x86 instruction emulation with decoding +- media: drivers/media/usb: fix memory leak in zr364xx_probe +- media: zr364xx: fix memory leaks in probe() +- media: zr364xx: propagate errors from zr364xx_start_readpipe() +- mtd: cfi_cmdset_0002: fix crash when erasing/writing AMD cards +- ath9k: Postpone key cache entry deletion for TXQ frames reference it +- ath: Modify ath_key_delete() to not need full key entry +- ath: Export ath_hw_keysetmac() +- ath9k: Clear key cache explicitly on disabling hardware +- ath: Use safer key clearing with key cache entries +- net: dsa: microchip: ksz8795: Use software untagging on CPU port +- net: dsa: microchip: ksz8795: Fix VLAN untagged flag change on deletion +- net: dsa: microchip: ksz8795: Reject unsupported VLAN configuration +- net: dsa: microchip: ksz8795: Fix PVID tag insertion +- net: dsa: microchip: Fix probing KSZ87xx switch with DT node for host port +- KVM: nSVM: always intercept VMLOAD/VMSAVE when nested (CVE-2021-3656) +- KVM: nSVM: avoid picking up unsupported bits from L2 in int_ctl (CVE-2021-3653) +- vmlinux.lds.h: Handle clang's module.{c,d}tor sections +- ceph: take snap_empty_lock atomically with snaprealm refcount change +- ceph: clean up locking annotation for ceph_get_snap_realm and __lookup_snap_realm +- ceph: add some lockdep assertions around snaprealm handling +- vboxsf: Add support for the atomic_open directory-inode op +- vboxsf: Add vboxsf_[create|release]_sf_handle() helpers +- KVM: nVMX: Use vmx_need_pf_intercept() when deciding if L0 wants a #PF +- KVM: VMX: Use current VMCS to query WAITPKG support for MSR emulation +- efi/libstub: arm64: Double check image alignment at entry +- powerpc/smp: Fix OOPS in topology_init() +- PCI/MSI: Protect msi_desc::masked for multi-MSI +- PCI/MSI: Use msi_mask_irq() in pci_msi_shutdown() +- PCI/MSI: Correct misleading comments +- PCI/MSI: Do not set invalid bits in MSI mask +- PCI/MSI: Enforce MSI[X] entry updates to be visible +- PCI/MSI: Enforce that MSI-X table entry is masked for update +- PCI/MSI: Mask all unused MSI-X entries +- PCI/MSI: Enable and mask MSI-X early +- genirq/timings: Prevent potential array overflow in __irq_timings_store() +- genirq/msi: Ensure deactivation on teardown +- x86/resctrl: Fix default monitoring groups reporting +- x86/ioapic: Force affinity setup before startup +- x86/msi: Force affinity setup before startup +- genirq: Provide IRQCHIP_AFFINITY_PRE_STARTUP +- x86/tools: Fix objdump version check again +- efi/libstub: arm64: Relax 2M alignment again for relocatable kernels +- efi/libstub: arm64: Force Image reallocation if BSS was not reserved +- arm64: efi: kaslr: Fix occasional random alloc (and boot) failure +- nbd: Aovid double completion of a request +- vsock/virtio: avoid potential deadlock when vsock device remove +- xen/events: Fix race in set_evtchn_to_irq +- drm/i915: Only access SFC_DONE when media domain is not fused off +- net: igmp: increase size of mr_ifc_count +- tcp_bbr: fix u32 wrap bug in round logic if bbr_init() called after 2B packets +- net: linkwatch: fix failure to restore device state across suspend/resume +- net: bridge: fix memleak in br_add_if() +- net: bridge: fix flags interpretation for extern learn fdb entries +- net: bridge: validate the NUD_PERMANENT bit when adding an extern_learn FDB entry +- net: dsa: sja1105: fix broken backpressure in .port_fdb_dump +- net: dsa: lantiq: fix broken backpressure in .port_fdb_dump +- net: dsa: lan9303: fix broken backpressure in .port_fdb_dump +- net: igmp: fix data-race in igmp_ifc_timer_expire() +- net: Fix memory leak in ieee802154_raw_deliver +- net: dsa: microchip: ksz8795: Fix VLAN filtering +- net: dsa: microchip: Fix ksz_read64() +- drm/meson: fix colour distortion from HDR set during vendor u-boot +- net/mlx5: Fix return value from tracer initialization +- net/mlx5: Synchronize correct IRQ when destroying CQ +- bareudp: Fix invalid read beyond skb's linear data +- psample: Add a fwd declaration for skbuff +- iavf: Set RSS LUT and key in reset handle path +- ice: don't remove netdev->dev_addr from uc sync list +- ice: Prevent probing virtual functions +- net: sched: act_mirred: Reset ct info when mirror/redirect skb +- net/smc: fix wait on already cleared link +- ppp: Fix generating ifname when empty IFLA_IFNAME is specified +- net: phy: micrel: Fix link detection on ksz87xx switch" +- bpf: Fix integer overflow involving bucket_size +- libbpf: Fix probe for BPF_PROG_TYPE_CGROUP_SOCKOPT +- platform/x86: pcengines-apuv2: Add missing terminating entries to gpio-lookup tables +- net: mvvp2: fix short frame size on s390 +- net: dsa: mt7530: add the missing RxUnicast MIB counter +- ASoC: cs42l42: Fix LRCLK frame start edge +- pinctrl: tigerlake: Fix GPIO mapping for newer version of software +- netfilter: nf_conntrack_bridge: Fix memory leak when error +- ASoC: cs42l42: Remove duplicate control for WNF filter frequency +- ASoC: cs42l42: Fix inversion of ADC Notch Switch control +- ASoC: SOF: Intel: hda-ipc: fix reply size checking +- ASoC: cs42l42: Don't allow SND_SOC_DAIFMT_LEFT_J +- ASoC: cs42l42: Correct definition of ADC Volume control +- pinctrl: mediatek: Fix fallback behavior for bias_set_combo +- ieee802154: hwsim: fix GPF in hwsim_new_edge_nl +- ieee802154: hwsim: fix GPF in hwsim_set_edge_lqi +- drm/amdgpu: don't enable baco on boco platforms in runpm +- drm/amd/display: use GFP_ATOMIC in amdgpu_dm_irq_schedule_work +- drm/amd/display: Remove invalid assert for ODM + MPC case +- libnvdimm/region: Fix label activation vs errors +- ACPI: NFIT: Fix support for virtual SPA ranges +- ceph: reduce contention in ceph_check_delayed_caps() +- ARC: fp: set FPU_STATUS.FWE to enable FPU_STATUS update on context switch +- net: ethernet: ti: cpsw: fix min eth packet size for non-switch use-cases +- seccomp: Fix setting loaded filter count during TSYNC +- scsi: lpfc: Move initialization of phba->poll_list earlier to avoid crash +- cifs: create sd context must be a multiple of 8 +- i2c: dev: zero out array used for i2c reads from userspace +- ASoC: intel: atom: Fix reference to PCM buffer address +- ASoC: tlv320aic31xx: Fix jack detection after suspend +- ASoC: uniphier: Fix reference to PCM buffer address +- ASoC: xilinx: Fix reference to PCM buffer address +- ASoC: amd: Fix reference to PCM buffer address +- iio: adc: Fix incorrect exit of for-loop +- iio: humidity: hdc100x: Add margin to the conversion time +- iio: adis: set GPIO reset pin direction +- iio: adc: ti-ads7950: Ensure CS is deasserted after reading channels +- net: xilinx_emaclite: Do not print real IOMEM pointer +- ovl: prevent private clone if bind mount is not allowed +- ppp: Fix generating ppp unit id when ifname is not specified +- ALSA: hda: Add quirk for ASUS Flow x13 +- ALSA: hda/realtek: fix mute/micmute LEDs for HP ProBook 650 G8 Notebook PC +- ALSA: pcm: Fix mmap breakage without explicit buffer setup +- USB:ehci:fix Kunpeng920 ehci hardware problem +- vboxsf: Make vboxsf_dir_create() return the handle for the created file +- vboxsf: Honor excl flag to the dir-inode create op +- arm64: dts: renesas: beacon: Fix USB ref clock references +- arm64: dts: renesas: beacon: Fix USB extal reference +- arm64: dts: renesas: rzg2: Add usb2_clksel to RZ/G2 M/N/H +- mm: make zone_to_nid() and zone_set_nid() available for DISCONTIGMEM +- Revert "selftests/resctrl: Use resctrl/info for feature detection" +- bpf: Add lockdown check for probe_write_user helper +- firmware: tee_bnxt: Release TEE shm, session, and context during kexec +- tee: Correct inappropriate usage of TEE_SHM_DMA_BUF flag +- KVM: SVM: Fix off-by-one indexing when nullifying last used SEV VMCB +- sched: Add menuconfig option for CONFIG_SCHED_OPTIMIZE_LOAD_TRACKING +- sched/rt: Fix double enqueue caused by rt_effective_prio +- Revert "sched/rt: Fix double enqueue caused by rt_effective_prio" +- drm/amdgpu/display: only enable aux backlight control for OLED panels +- smb3: rc uninitialized in one fallocate path +- net/qla3xxx: fix schedule while atomic in ql_wait_for_drvr_lock and ql_adapter_reset +- alpha: Send stop IPI to send to online CPUs +- net: qede: Fix end of loop tests for list_for_each_entry +- virt_wifi: fix error on connect +- reiserfs: check directory items on read from disk +- reiserfs: add check for root_inode in reiserfs_fill_super +- libata: fix ata_pio_sector for CONFIG_HIGHMEM +- drm/i915: avoid uninitialised var in eb_parse() +- sched/rt: Fix double enqueue caused by rt_effective_prio +- perf/x86/amd: Don't touch the AMD64_EVENTSEL_HOSTONLY bit inside the guest +- soc: ixp4xx/qmgr: fix invalid __iomem access +- drm/i915: Correct SFC_DONE register offset +- interconnect: qcom: icc-rpmh: Ensure floor BW is enforced for all nodes +- interconnect: Always call pre_aggregate before aggregate +- interconnect: Zero initial BW after sync-state +- spi: meson-spicc: fix memory leak in meson_spicc_remove +- interconnect: Fix undersized devress_alloc allocation +- soc: ixp4xx: fix printing resources +- arm64: vdso: Avoid ISB after reading from cntvct_el0 +- KVM: x86/mmu: Fix per-cpu counter corruption on 32-bit builds +- KVM: Do not leak memory for duplicate debugfs directories +- KVM: x86: accept userspace interrupt only if no event is injected +- md/raid10: properly indicate failure when ending a failed write request +- ARM: omap2+: hwmod: fix potential NULL pointer access +- Revert "gpio: mpc8xxx: change the gpio interrupt flags." +- bus: ti-sysc: AM3: RNG is GP only +- selinux: correct the return value when loads initial sids +- pcmcia: i82092: fix a null pointer dereference bug +- net/xfrm/compat: Copy xfrm_spdattr_type_t atributes +- xfrm: Fix RCU vs hash_resize_mutex lock inversion +- timers: Move clearing of base::timer_running under base:: Lock +- fpga: dfl: fme: Fix cpu hotplug issue in performance reporting +- serial: 8250_pci: Avoid irq sharing for MSI(-X) interrupts. +- serial: 8250_pci: Enumerate Elkhart Lake UARTs via dedicated driver +- MIPS: Malta: Do not byte-swap accesses to the CBUS UART +- serial: 8250: Mask out floating 16/32-bit bus bits +- serial: 8250_mtk: fix uart corruption issue when rx power off +- serial: tegra: Only print FIFO error message when an error occurs +- ext4: fix potential htree corruption when growing large_dir directories +- pipe: increase minimum default pipe size to 2 pages +- media: rtl28xxu: fix zero-length control request +- drivers core: Fix oops when driver probe fails +- staging: rtl8712: error handling refactoring +- staging: rtl8712: get rid of flush_scheduled_work +- staging: rtl8723bs: Fix a resource leak in sd_int_dpc +- tpm_ftpm_tee: Free and unregister TEE shared memory during kexec +- optee: fix tee out of memory failure seen during kexec reboot +- optee: Refuse to load the driver under the kdump kernel +- optee: Fix memory leak when failing to register shm pages +- tee: add tee_shm_alloc_kernel_buf() +- optee: Clear stale cache entries during initialization +- arm64: stacktrace: avoid tracing arch_stack_walk() +- tracepoint: Fix static call function vs data state mismatch +- tracepoint: static call: Compare data on transition from 2->1 callees +- tracing: Fix NULL pointer dereference in start_creating +- tracing: Reject string operand in the histogram expression +- tracing / histogram: Give calculation hist_fields a size +- scripts/tracing: fix the bug that can't parse raw_trace_func +- clk: fix leak on devm_clk_bulk_get_all() unwind +- usb: otg-fsm: Fix hrtimer list corruption +- usb: typec: tcpm: Keep other events when receiving FRS and Sourcing_vbus events +- usb: host: ohci-at91: suspend/resume ports after/before OHCI accesses +- usb: gadget: f_hid: idle uses the highest byte for duration +- usb: gadget: f_hid: fixed NULL pointer dereference +- usb: gadget: f_hid: added GET_IDLE and SET_IDLE handlers +- usb: cdns3: Fixed incorrect gadget state +- usb: gadget: remove leaked entry from udc driver list +- usb: dwc3: gadget: Avoid runtime resume if disabling pullup +- ALSA: usb-audio: Add registration quirk for JBL Quantum 600 +- ALSA: usb-audio: Fix superfluous autosuspend recovery +- ALSA: hda/realtek: Fix headset mic for Acer SWIFT SF314-56 (ALC256) +- ALSA: hda/realtek: add mic quirk for Acer SF314-42 +- ALSA: pcm - fix mmap capability check for the snd-dummy driver +- drm/amdgpu/display: fix DMUB firmware version info +- firmware_loader: fix use-after-free in firmware_fallback_sysfs +- firmware_loader: use -ETIMEDOUT instead of -EAGAIN in fw_load_sysfs_fallback +- USB: serial: ftdi_sio: add device ID for Auto-M3 OP-COM v2 +- USB: serial: ch341: fix character loss at high transfer rates +- USB: serial: option: add Telit FD980 composition 0x1056 +- USB: usbtmc: Fix RCU stall warning +- Bluetooth: defer cleanup of resources in hci_unregister_dev() +- blk-iolatency: error out if blk_get_queue() failed in iolatency_set_limit() +- net: vxge: fix use-after-free in vxge_device_unregister +- net: fec: fix use-after-free in fec_drv_remove +- net: pegasus: fix uninit-value in get_interrupt_interval +- bnx2x: fix an error code in bnx2x_nic_load() +- mips: Fix non-POSIX regexp +- MIPS: check return value of pgtable_pmd_page_ctor +- net: sched: fix lockdep_set_class() typo error for sch->seqlock +- net: dsa: qca: ar9331: reorder MDIO write sequence +- net: ipv6: fix returned variable type in ip6_skb_dst_mtu +- nfp: update ethtool reporting of pauseframe control +- sctp: move the active_key update after sh_keys is added +- RDMA/mlx5: Delay emptying a cache entry when a new MR is added to it recently +- gpio: tqmx86: really make IRQ optional +- net: natsemi: Fix missing pci_disable_device() in probe and remove +- net: phy: micrel: Fix detection of ksz87xx switch +- net: dsa: sja1105: match FDB entries regardless of inner/outer VLAN tag +- net: dsa: sja1105: be stateless with FDB entries on SJA1105P/Q/R/S/SJA1110 too +- net: dsa: sja1105: invalidate dynamic FDB entries learned concurrently with statically added ones +- net: dsa: sja1105: overwrite dynamic FDB entries with static ones in .port_fdb_add +- net, gro: Set inner transport header offset in tcp/udp GRO hook +- dmaengine: imx-dma: configure the generic DMA type to make it work +- ARM: dts: stm32: Fix touchscreen IRQ line assignment on DHCOM +- ARM: dts: stm32: Disable LAN8710 EDPD on DHCOM +- media: videobuf2-core: dequeue if start_streaming fails +- scsi: sr: Return correct event when media event code is 3 +- spi: imx: mx51-ecspi: Fix low-speed CONFIGREG delay calculation +- spi: imx: mx51-ecspi: Reinstate low-speed CONFIGREG delay +- dmaengine: stm32-dmamux: Fix PM usage counter unbalance in stm32 dmamux ops +- dmaengine: stm32-dma: Fix PM usage counter imbalance in stm32 dma ops +- clk: tegra: Implement disable_unused() of tegra_clk_sdmmc_mux_ops +- dmaengine: uniphier-xdmac: Use readl_poll_timeout_atomic() in atomic state +- omap5-board-common: remove not physically existing vdds_1v8_main fixed-regulator +- ARM: dts: am437x-l4: fix typo in can@0 node +- clk: stm32f4: fix post divisor setup for I2S/SAI PLLs +- ALSA: usb-audio: fix incorrect clock source setting +- arm64: dts: armada-3720-turris-mox: remove mrvl,i2c-fast-mode +- arm64: dts: armada-3720-turris-mox: fixed indices for the SDHC controllers +- ARM: dts: imx: Swap M53Menlo pinctrl_power_button/pinctrl_power_out pins +- ARM: imx: fix missing 3rd argument in macro imx_mmdc_perf_init +- ARM: dts: colibri-imx6ull: limit SDIO clock to 25MHz +- arm64: dts: ls1028: sl28: fix networking for variant 2 +- ARM: dts: imx6qdl-sr-som: Increase the PHY reset duration to 10ms +- ARM: imx: add missing clk_disable_unprepare() +- ARM: imx: add missing iounmap() +- arm64: dts: ls1028a: fix node name for the sysclk +- net: xfrm: fix memory leak in xfrm_user_rcv_msg +- bus: ti-sysc: Fix gpt12 system timer issue with reserved status +- ALSA: seq: Fix racy deletion of subscriber +- Revert "ACPICA: Fix memory leak caused by _CID repair function" +- sched/idle: Add IAS_SMART_HALT_POLL config for smart halt polling feature +- sched/idle: introduce smart halt polling +- arm: Optimize ttwu IPI +- kthread: Fix PF_KTHREAD vs to_kthread() race +- mtd: mtdconcat: Check _read,_write callbacks existence before assignment +- mtd: mtdconcat: Judge callback existence based on the master +- lib: use PFN_PHYS() in devmem_is_allowed() +- arm64: fix compat syscall return truncation +- blk: reuse lookup_sem to serialize partition operations +- Revert "[Backport] block: take bd_mutex around delete_partitions in del_gendisk" +- Revert "[Huawei] block: avoid creating invalid symlink file for patitions" +- block: ensure the memory order between bi_private and bi_status +- amba-pl011: Fix no irq issue due to no IRQ domain found +- arm64: seccomp: fix the incorrect name of syscall __NR_compat_exit in secure computing mode +- seqlock: avoid -Wshadow warnings +- asm-generic: fix ffs -Wshadow warning +- spi: mediatek: Fix fifo transfer +- selftest/bpf: Verifier tests for var-off access +- bpf, selftests: Adjust few selftest outcomes wrt unreachable code +- bpf: Update selftests to reflect new error states +- bpf, selftests: Adjust few selftest result_unpriv outcomes +- selftest/bpf: Adjust expected verifier errors +- selftests/bpf: Add a test for ptr_to_map_value on stack for helper access +- Revert "watchdog: iTCO_wdt: Account for rebooting on second timeout" +- firmware: arm_scmi: Add delayed response status check +- firmware: arm_scmi: Ensure drivers provide a probe function +- Revert "Bluetooth: Shutdown controller after workqueues are flushed or cancelled" +- ACPI: fix NULL pointer dereference +- drm/amd/display: Fix max vstartup calculation for modes with borders +- drm/amd/display: Fix comparison error in dcn21 DML +- nvme: fix nvme_setup_command metadata trace event +- efi/mokvar: Reserve the table only if it is in boot services data +- ASoC: ti: j721e-evm: Check for not initialized parent_clk_id +- ASoC: ti: j721e-evm: Fix unbalanced domain activity tracking during startup +- net: Fix zero-copy head len calculation. +- ASoC: rt5682: Fix the issue of garbled recording after powerd_dbus_suspend +- qed: fix possible unpaired spin_{un}lock_bh in _qed_mcp_cmd_and_union() +- r8152: Fix potential PM refcount imbalance +- ASoC: tlv320aic31xx: fix reversed bclk/wclk master bits +- spi: stm32h7: fix full duplex irq handler handling +- regulator: rt5033: Fix n_voltages settings for BUCK and LDO +- regulator: rtmv20: Fix wrong mask for strobe-polarity-high +- btrfs: fix lost inode on log replay after mix of fsync, rename and inode eviction +- btrfs: fix race causing unnecessary inode logging during link and rename +- Revert "drm/i915: Propagate errors on awaiting already signaled fences" +- drm/i915: Revert "drm/i915/gem: Asynchronous cmdparser" +- powerpc/kprobes: Fix kprobe Oops happens in booke +- sched: Fix branch prediction error in static_key +- sched: Access control for sysctl_update_load_latency +- mm,hwpoison: return -EHWPOISON to denote that the page has already been poisoned +- mm/memory-failure: use a mutex to avoid memory_failure() races +- can: j1939: j1939_session_deactivate(): clarify lifetime of session object +- i40e: Add additional info to PHY type error +- Revert "perf map: Fix dso->nsinfo refcounting" +- powerpc/pseries: Fix regression while building external modules +- SMB3: fix readpage for large swap cache +- bpf: Fix pointer arithmetic mask tightening under state pruning +- bpf: verifier: Allocate idmap scratch in verifier env +- bpf: Remove superfluous aux sanitation on subprog rejection +- bpf: Fix leakage due to insufficient speculative store bypass mitigation +- bpf: Introduce BPF nospec instruction for mitigating Spectre v4 +- can: hi311x: fix a signedness bug in hi3110_cmd() +- sis900: Fix missing pci_disable_device() in probe and remove +- tulip: windbond-840: Fix missing pci_disable_device() in probe and remove +- sctp: fix return value check in __sctp_rcv_asconf_lookup +- net/mlx5e: Fix nullptr in mlx5e_hairpin_get_mdev() +- net/mlx5: Fix flow table chaining +- skmsg: Make sk_psock_destroy() static +- drm/msm/dp: Initialize the INTF_CONFIG register +- drm/msm/dpu: Fix sm8250_mdp register length +- net: llc: fix skb_over_panic +- KVM: x86: Check the right feature bit for MSR_KVM_ASYNC_PF_ACK access +- mlx4: Fix missing error code in mlx4_load_one() +- octeontx2-pf: Fix interface down flag on error +- tipc: do not write skb_shinfo frags when doing decrytion +- ionic: count csum_none when offload enabled +- ionic: fix up dim accounting for tx and rx +- ionic: remove intr coalesce update from napi +- net: qrtr: fix memory leaks +- net: Set true network header for ECN decapsulation +- tipc: fix sleeping in tipc accept routine +- tipc: fix implicit-connect for SYN+ +- i40e: Fix log TC creation failure when max num of queues is exceeded +- i40e: Fix queue-to-TC mapping on Tx +- i40e: Fix firmware LLDP agent related warning +- i40e: Fix logic of disabling queues +- netfilter: nft_nat: allow to specify layer 4 protocol NAT only +- netfilter: conntrack: adjust stop timestamp to real expiry value +- mac80211: fix enabling 4-address mode on a sta vif after assoc +- bpf: Fix OOB read when printing XDP link fdinfo +- RDMA/bnxt_re: Fix stats counters +- cfg80211: Fix possible memory leak in function cfg80211_bss_update +- nfc: nfcsim: fix use after free during module unload +- blk-iocost: fix operation ordering in iocg_wake_fn() +- drm/amdgpu: Fix resource leak on probe error path +- drm/amdgpu: Avoid printing of stack contents on firmware load error +- drm/amd/display: ensure dentist display clock update finished in DCN20 +- NIU: fix incorrect error return, missed in previous revert +- HID: wacom: Re-enable touch by default for Cintiq 24HDT / 27QHDT +- alpha: register early reserved memory in memblock +- can: esd_usb2: fix memory leak +- can: ems_usb: fix memory leak +- can: usb_8dev: fix memory leak +- can: mcba_usb_start(): add missing urb->transfer_dma initialization +- can: peak_usb: pcan_usb_handle_bus_evt(): fix reading rxerr/txerr values +- can: raw: raw_setsockopt(): fix raw_rcv panic for sock UAF +- can: j1939: j1939_xtp_rx_dat_one(): fix rxtimer value between consecutive TP.DT to 750ms +- ocfs2: issue zeroout to EOF blocks +- ocfs2: fix zero out valid data +- KVM: add missing compat KVM_CLEAR_DIRTY_LOG +- x86/kvm: fix vcpu-id indexed array sizes +- ACPI: DPTF: Fix reading of attributes +- Revert "ACPI: resources: Add checks for ACPI IRQ override" +- btrfs: mark compressed range uptodate only if all bio succeed +- btrfs: fix rw device counting in __btrfs_free_extra_devids +- pipe: make pipe writes always wake up readers +- x86/asm: Ensure asm/proto.h can be included stand-alone +- io_uring: fix null-ptr-deref in io_sq_offload_start() +- selftest: fix build error in tools/testing/selftests/vm/userfaultfd.c +- ipv6: ip6_finish_output2: set sk into newly allocated nskb +- ARM: dts: versatile: Fix up interrupt controller node names +- iomap: remove the length variable in iomap_seek_hole +- iomap: remove the length variable in iomap_seek_data +- cifs: fix the out of range assignment to bit fields in parse_server_interfaces +- firmware: arm_scmi: Fix range check for the maximum number of pending messages +- firmware: arm_scmi: Fix possible scmi_linux_errmap buffer overflow +- hfs: add lock nesting notation to hfs_find_init +- hfs: fix high memory mapping in hfs_bnode_read +- hfs: add missing clean-up in hfs_fill_super +- drm/ttm: add a check against null pointer dereference +- ipv6: allocate enough headroom in ip6_finish_output2() +- rcu-tasks: Don't delete holdouts within trc_wait_for_one_reader() +- rcu-tasks: Don't delete holdouts within trc_inspect_reader() +- sctp: move 198 addresses from unusable to private scope +- net: annotate data race around sk_ll_usec +- net/802/garp: fix memleak in garp_request_join() +- net/802/mrp: fix memleak in mrp_request_join() +- cgroup1: fix leaked context root causing sporadic NULL deref in LTP +- workqueue: fix UAF in pwq_unbound_release_workfn() +- af_unix: fix garbage collect vs MSG_PEEK +- KVM: x86: determine if an exception has an error code only when injecting it. +- io_uring: fix link timeout refs +- tools: Allow proper CC/CXX/... override with LLVM=1 in Makefile.include +- perf annotate: Add error log in symbol__annotate() +- perf env: Normalize aarch64.* and arm64.* to arm64 in normalize_arch() +- skbuff: Fix build with SKB extensions disabled +- xhci: add xhci_get_virt_ep() helper +- sfc: ensure correct number of XDP queues +- drm/i915/gvt: Clear d3_entered on elsp cmd submission. +- usb: ehci: Prevent missed ehci interrupts with edge-triggered MSI +- perf inject: Close inject.output on exit +- Documentation: Fix intiramfs script name +- skbuff: Release nfct refcount on napi stolen or re-used skbs +- bonding: fix build issue +- PCI: Mark AMD Navi14 GPU ATS as broken +- net: dsa: mv88e6xxx: enable SerDes PCS register dump via ethtool -d on Topaz +- net: dsa: mv88e6xxx: enable SerDes RX stats for Topaz +- drm/amdgpu: update golden setting for sienna_cichlid +- drm: Return -ENOTTY for non-drm ioctls +- driver core: Prevent warning when removing a device link from unregistered consumer +- nds32: fix up stack guard gap +- misc: eeprom: at24: Always append device id even if label property is set. +- rbd: always kick acquire on "acquired" and "released" notifications +- rbd: don't hold lock_rwsem while running_list is being drained +- hugetlbfs: fix mount mode command line processing +- memblock: make for_each_mem_range() traverse MEMBLOCK_HOTPLUG regions +- userfaultfd: do not untag user pointers +- io_uring: remove double poll entry on arm failure +- io_uring: explicitly count entries for poll reqs +- selftest: use mmap instead of posix_memalign to allocate memory +- posix-cpu-timers: Fix rearm racing against process tick +- bus: mhi: core: Validate channel ID when processing command completions +- ixgbe: Fix packet corruption due to missing DMA sync +- media: ngene: Fix out-of-bounds bug in ngene_command_config_free_buf() +- btrfs: check for missing device in btrfs_trim_fs +- tracing: Synthetic event field_pos is an index not a boolean +- tracing: Fix bug in rb_per_cpu_empty() that might cause deadloop. +- tracing/histogram: Rename "cpu" to "common_cpu" +- tracepoints: Update static_call before tp_funcs when adding a tracepoint +- firmware/efi: Tell memblock about EFI iomem reservations +- usb: typec: stusb160x: register role switch before interrupt registration +- usb: dwc2: gadget: Fix sending zero length packet in DDMA mode. +- usb: dwc2: gadget: Fix GOUTNAK flow for Slave mode. +- usb: gadget: Fix Unbalanced pm_runtime_enable in tegra_xudc_probe +- USB: serial: cp210x: add ID for CEL EM3588 USB ZigBee stick +- USB: serial: cp210x: fix comments for GE CS1000 +- USB: serial: option: add support for u-blox LARA-R6 family +- usb: renesas_usbhs: Fix superfluous irqs happen after usb_pkt_pop() +- usb: max-3421: Prevent corruption of freed memory +- USB: usb-storage: Add LaCie Rugged USB3-FW to IGNORE_UAS +- usb: hub: Fix link power management max exit latency (MEL) calculations +- usb: hub: Disable USB 3 device initiated lpm if exit latency is too high +- KVM: PPC: Book3S HV Nested: Sanitise H_ENTER_NESTED TM state +- KVM: PPC: Book3S: Fix H_RTAS rets buffer overflow +- xhci: Fix lost USB 2 remote wake +- usb: xhci: avoid renesas_usb_fw.mem when it's unusable +- Revert "usb: renesas-xhci: Fix handling of unknown ROM state" +- ALSA: pcm: Fix mmap capability check +- ALSA: pcm: Call substream ack() method upon compat mmap commit +- ALSA: hdmi: Expose all pins on MSI MS-7C94 board +- ALSA: hda/realtek: Fix pop noise and 2 Front Mic issues on a machine +- ALSA: sb: Fix potential ABBA deadlock in CSP driver +- ALSA: usb-audio: Add registration quirk for JBL Quantum headsets +- ALSA: usb-audio: Add missing proc text entry for BESPOKEN type +- s390/boot: fix use of expolines in the DMA code +- s390/ftrace: fix ftrace_update_ftrace_func implementation +- mmc: core: Don't allocate IDA for OF aliases +- proc: Avoid mixing integer types in mem_rw() +- cifs: fix fallocate when trying to allocate a hole. +- cifs: only write 64kb at a time when fallocating a small region of a file +- drm/panel: raspberrypi-touchscreen: Prevent double-free +- net: sched: cls_api: Fix the the wrong parameter +- net: dsa: sja1105: make VID 4095 a bridge VLAN too +- tcp: disable TFO blackhole logic by default +- sctp: update active_key for asoc when old key is being replaced +- nvme: set the PRACT bit when using Write Zeroes with T10 PI +- r8169: Avoid duplicate sysfs entry creation error +- afs: Fix tracepoint string placement with built-in AFS +- Revert "USB: quirks: ignore remote wake-up on Fibocom L850-GL LTE modem" +- nvme-pci: don't WARN_ON in nvme_reset_work if ctrl.state is not RESETTING +- ceph: don't WARN if we're still opening a session to an MDS +- ipv6: fix another slab-out-of-bounds in fib6_nh_flush_exceptions +- net/sched: act_skbmod: Skip non-Ethernet packets +- spi: spi-bcm2835: Fix deadlock +- ALSA: hda: intel-dsp-cfg: add missing ElkhartLake PCI ID +- net/tcp_fastopen: fix data races around tfo_active_disable_stamp +- net: hisilicon: rename CACHE_LINE_MASK to avoid redefinition +- bnxt_en: Check abort error state in bnxt_half_open_nic() +- bnxt_en: Validate vlan protocol ID on RX packets +- bnxt_en: Add missing check for BNXT_STATE_ABORT_ERR in bnxt_fw_rset_task() +- bnxt_en: Refresh RoCE capabilities in bnxt_ulp_probe() +- bnxt_en: don't disable an already disabled PCI device +- ACPI: Kconfig: Fix table override from built-in initrd +- spi: cadence: Correct initialisation of runtime PM again +- scsi: target: Fix protect handling in WRITE SAME(32) +- scsi: iscsi: Fix iface sysfs attr detection +- netrom: Decrease sock refcount when sock timers expire +- sctp: trim optlen when it's a huge value in sctp_setsockopt +- net: sched: fix memory leak in tcindex_partial_destroy_work +- KVM: PPC: Fix kvm_arch_vcpu_ioctl vcpu_load leak +- KVM: PPC: Book3S: Fix CONFIG_TRANSACTIONAL_MEM=n crash +- net: decnet: Fix sleeping inside in af_decnet +- efi/tpm: Differentiate missing and invalid final event log table. +- dma-mapping: handle vmalloc addresses in dma_common_{mmap,get_sgtable} +- usb: hso: fix error handling code of hso_create_net_device +- net: fix uninit-value in caif_seqpkt_sendmsg +- bpftool: Check malloc return value in mount_bpffs_for_pin +- bpf, sockmap, udp: sk_prot needs inuse_idx set for proc stats +- bpf, sockmap, tcp: sk_prot needs inuse_idx set for proc stats +- bpf, sockmap: Fix potential memory leak on unlikely error case +- s390/bpf: Perform r1 range checking before accessing jit->seen_reg[r1] +- liquidio: Fix unintentional sign extension issue on left shift of u16 +- timers: Fix get_next_timer_interrupt() with no timers pending +- xdp, net: Fix use-after-free in bpf_xdp_link_release +- bpf: Fix tail_call_reachable rejection for interpreter when jit failed +- bpf, test: fix NULL pointer dereference on invalid expected_attach_type +- ASoC: rt5631: Fix regcache sync errors on resume +- spi: mediatek: fix fifo rx mode +- regulator: hi6421: Fix getting wrong drvdata +- regulator: hi6421: Use correct variable type for regmap api val argument +- spi: stm32: fixes pm_runtime calls in probe/remove +- spi: imx: add a check for speed_hz before calculating the clock +- ASoC: wm_adsp: Correct wm_coeff_tlv_get handling +- perf sched: Fix record failure when CONFIG_SCHEDSTATS is not set +- perf lzma: Close lzma stream on exit +- perf script: Fix memory 'threads' and 'cpus' leaks on exit +- perf report: Free generated help strings for sort option +- perf env: Fix memory leak of cpu_pmu_caps +- perf test maps__merge_in: Fix memory leak of maps +- perf dso: Fix memory leak in dso__new_map() +- perf test event_update: Fix memory leak of evlist +- perf test session_topology: Delete session->evlist +- perf env: Fix sibling_dies memory leak +- perf probe: Fix dso->nsinfo refcounting +- perf map: Fix dso->nsinfo refcounting +- perf inject: Fix dso->nsinfo refcounting +- KVM: x86/pmu: Clear anythread deprecated bit when 0xa leaf is unsupported on the SVM +- nvme-pci: do not call nvme_dev_remove_admin from nvme_remove +- mptcp: fix warning in __skb_flow_dissect() when do syn cookie for subflow join +- cxgb4: fix IRQ free race during driver unload +- pwm: sprd: Ensure configuring period and duty_cycle isn't wrongly skipped +- selftests: icmp_redirect: IPv6 PMTU info should be cleared after redirect +- selftests: icmp_redirect: remove from checking for IPv6 route get +- stmmac: platform: Fix signedness bug in stmmac_probe_config_dt() +- ipv6: fix 'disable_policy' for fwd packets +- bonding: fix incorrect return value of bond_ipsec_offload_ok() +- bonding: fix suspicious RCU usage in bond_ipsec_offload_ok() +- bonding: Add struct bond_ipesc to manage SA +- bonding: disallow setting nested bonding + ipsec offload +- bonding: fix suspicious RCU usage in bond_ipsec_del_sa() +- ixgbevf: use xso.real_dev instead of xso.dev in callback functions of struct xfrmdev_ops +- bonding: fix null dereference in bond_ipsec_add_sa() +- bonding: fix suspicious RCU usage in bond_ipsec_add_sa() +- net: add kcov handle to skb extensions +- gve: Fix an error handling path in 'gve_probe()' +- igb: Fix position of assignment to *ring +- igb: Check if num of q_vectors is smaller than max before array access +- iavf: Fix an error handling path in 'iavf_probe()' +- e1000e: Fix an error handling path in 'e1000_probe()' +- fm10k: Fix an error handling path in 'fm10k_probe()' +- igb: Fix an error handling path in 'igb_probe()' +- igc: Fix an error handling path in 'igc_probe()' +- ixgbe: Fix an error handling path in 'ixgbe_probe()' +- igc: change default return of igc_read_phy_reg() +- igb: Fix use-after-free error during reset +- igc: Fix use-after-free error during reset +- sched: Add frequency control for load update in scheduler_tick +- sched: Add switch for update_blocked_averages +- sched: Introcude config option SCHED_OPTIMIZE_LOAD_TRACKING +- udp: annotate data races around unix_sk(sk)->gso_size +- drm/panel: nt35510: Do not fail if DSI read fails +- bpf: Track subprog poke descriptors correctly and fix use-after-free +- bpftool: Properly close va_list 'ap' by va_end() on error +- tools: bpf: Fix error in 'make -C tools/ bpf_install' +- tcp: call sk_wmem_schedule before sk_mem_charge in zerocopy path +- ipv6: tcp: drop silly ICMPv6 packet too big messages +- tcp: fix tcp_init_transfer() to not reset icsk_ca_initialized +- tcp: annotate data races around tp->mtu_info +- tcp: consistently disable header prediction for mptcp +- ARM: dts: tacoma: Add phase corrections for eMMC +- ARM: dts: aspeed: Fix AST2600 machines line names +- kbuild: do not suppress Kconfig prompts for silent build +- dma-buf/sync_file: Don't leak fences on merge failure +- net: fddi: fix UAF in fza_probe +- net: dsa: properly check for the bridge_leave methods in dsa_switch_bridge_leave() +- Revert "mm/shmem: fix shmem_swapin() race with swapoff" +- net: validate lwtstate->data before returning from skb_tunnel_info() +- net: send SYNACK packet with accepted fwmark +- net: ti: fix UAF in tlan_remove_one +- net: qcom/emac: fix UAF in emac_remove +- net: moxa: fix UAF in moxart_mac_probe +- net: ip_tunnel: fix mtu calculation for ETHER tunnel devices +- net: bcmgenet: Ensure all TX/RX queues DMAs are disabled +- net: netdevsim: use xso.real_dev instead of xso.dev in callback functions of struct xfrmdev_ops +- net: bridge: sync fdb to new unicast-filtering ports +- net/sched: act_ct: remove and free nf_table callbacks +- vmxnet3: fix cksum offload issues for tunnels with non-default udp ports +- net/sched: act_ct: fix err check for nf_conntrack_confirm +- netfilter: ctnetlink: suspicious RCU usage in ctnetlink_dump_helpinfo +- net: ipv6: fix return value of ip6_skb_dst_mtu +- net: dsa: mv88e6xxx: enable devlink ATU hash param for Topaz +- net: dsa: mv88e6xxx: enable .rmu_disable() on Topaz +- net: dsa: mv88e6xxx: use correct .stats_set_histogram() on Topaz +- net: dsa: mv88e6xxx: enable .port_set_policy() on Topaz +- net: bcmgenet: ensure EXT_ENERGY_DET_MASK is clear +- usb: cdns3: Enable TDL_CHK only for OUT ep +- mm/page_alloc: fix memory map initialization for descending nodes +- mm/userfaultfd: fix uffd-wp special cases for fork() +- mm/thp: simplify copying of huge zero page pmd when fork +- f2fs: Show casefolding support only when supported +- Revert "swap: fix do_swap_page() race with swapoff" +- arm64: dts: marvell: armada-37xx: move firmware node to generic dtsi file +- firmware: turris-mox-rwtm: add marvell,armada-3700-rwtm-firmware compatible string +- cifs: prevent NULL deref in cifs_compose_mount_options() +- s390: introduce proper type handling call_on_stack() macro +- s390/traps: do not test MONITOR CALL without CONFIG_BUG +- thermal/core/thermal_of: Stop zone device before unregistering it +- perf/x86/intel/uncore: Clean up error handling path of iio mapping +- sched/fair: Fix CFS bandwidth hrtimer expiry type +- scsi: qedf: Add check to synchronize abort and flush +- scsi: libfc: Fix array index out of bound exception +- scsi: aic7xxx: Fix unintentional sign extension issue on left shift of u8 +- rtc: max77686: Do not enforce (incorrect) interrupt trigger type +- arch/arm64/boot/dts/marvell: fix NAND partitioning scheme +- kbuild: mkcompile_h: consider timestamp if KBUILD_BUILD_TIMESTAMP is set +- thermal/drivers/sprd: Add missing of_node_put for loop iteration +- thermal/drivers/imx_sc: Add missing of_node_put for loop iteration +- thermal/drivers/rcar_gen3_thermal: Do not shadow rcar_gen3_ths_tj_1 +- thermal/core: Correct function name thermal_zone_device_unregister() +- arm64: dts: imx8mq: assign PCIe clocks +- arm64: dts: ls208xa: remove bus-num from dspi node +- firmware: tegra: bpmp: Fix Tegra234-only builds +- soc/tegra: fuse: Fix Tegra234-only builds +- ARM: OMAP2+: Block suspend for am3 and am4 if PM is not configured +- ARM: dts: stm32: fix stpmic node for stm32mp1 boards +- ARM: dts: stm32: Rename spi-flash/mx66l51235l@N to flash@N on DHCOM SoM +- ARM: dts: stm32: Drop unused linux,wakeup from touchscreen node on DHCOM SoM +- ARM: dts: stm32: fix the Odyssey SoM eMMC VQMMC supply +- ARM: dts: stm32: move stmmac axi config in ethernet node on stm32mp15 +- ARM: dts: stm32: fix i2c node name on stm32f746 to prevent warnings +- ARM: dts: rockchip: fix supply properties in io-domains nodes +- arm64: dts: juno: Update SCPI nodes as per the YAML schema +- ARM: dts: bcm283x: Fix up GPIO LED node names +- ARM: dts: bcm283x: Fix up MMC node names +- firmware: arm_scmi: Fix the build when CONFIG_MAILBOX is not selected +- firmware: arm_scmi: Add SMCCC discovery dependency in Kconfig +- memory: tegra: Fix compilation warnings on 64bit platforms +- ARM: dts: stm32: fix timer nodes on STM32 MCU to prevent warnings +- ARM: dts: stm32: fix RCC node name on stm32f429 MCU +- ARM: dts: stm32: fix gpio-keys node on STM32 MCU boards +- ARM: dts: stm32: fix stm32mp157c-odyssey card detect pin +- ARM: dts: stm32: Fix touchscreen node on dhcom-pdk2 +- ARM: dts: stm32: Remove extra size-cells on dhcom-pdk2 +- arm64: dts: qcom: sc7180: Move rmtfs memory region +- ARM: tegra: nexus7: Correct 3v3 regulator GPIO of PM269 variant +- ARM: tegra: wm8903: Fix polarity of headphones-detection GPIO in device-trees +- arm64: dts: ti: k3-am654x/j721e/j7200-common-proc-board: Fix MCU_RGMII1_TXC direction +- ARM: dts: OMAP2+: Replace underscores in sub-mailbox node names +- ARM: dts: am335x: fix ti,no-reset-on-init flag for gpios +- ARM: dts: am437x-gp-evm: fix ti,no-reset-on-init flag for gpios +- ARM: dts: am57xx-cl-som-am57x: fix ti,no-reset-on-init flag for gpios +- kbuild: sink stdout from cmd for silent build +- rtc: mxc_v2: add missing MODULE_DEVICE_TABLE +- ARM: dts: imx6dl-riotboard: configure PHY clock and set proper EEE value +- ARM: dts: ux500: Fix orientation of accelerometer +- ARM: dts: ux500: Rename gpio-controller node +- ARM: dts: ux500: Fix interrupt cells +- arm64: dts: rockchip: fix regulator-gpio states array +- ARM: imx: pm-imx5: Fix references to imx5_cpu_suspend_info +- ARM: dts: imx6: phyFLEX: Fix UART hardware flow control +- ARM: dts: Hurricane 2: Fix NAND nodes names +- ARM: dts: BCM63xx: Fix NAND nodes names +- ARM: NSP: dts: fix NAND nodes names +- ARM: Cygnus: dts: fix NAND nodes names +- ARM: brcmstb: dts: fix NAND nodes names +- reset: ti-syscon: fix to_ti_syscon_reset_data macro +- arm64: dts: rockchip: Fix power-controller node names for rk3399 +- arm64: dts: rockchip: Fix power-controller node names for rk3328 +- arm64: dts: rockchip: Fix power-controller node names for px30 +- ARM: dts: rockchip: Fix power-controller node names for rk3288 +- ARM: dts: rockchip: Fix power-controller node names for rk3188 +- ARM: dts: rockchip: Fix power-controller node names for rk3066a +- ARM: dts: rockchip: Fix IOMMU nodes properties on rk322x +- ARM: dts: rockchip: Fix the timer clocks order +- arm64: dts: rockchip: fix pinctrl sleep nodename for rk3399.dtsi +- ARM: dts: rockchip: fix pinctrl sleep nodename for rk3036-kylin and rk3288 +- ARM: dts: rockchip: Fix thermal sensor cells o rk322x +- ARM: dts: gemini: add device_type on pci +- ARM: dts: gemini: rename mdio to the right name +- scsi: scsi_dh_alua: Fix signedness bug in alua_rtpg() +- MIPS: vdso: Invalid GIC access through VDSO +- mips: disable branch profiling in boot/decompress.o +- mips: always link byteswap helpers into decompressor +- static_call: Fix static_call_text_reserved() vs __init +- jump_label: Fix jump_label_text_reserved() vs __init +- sched/uclamp: Ignore max aggregation if rq is idle +- scsi: be2iscsi: Fix an error handling path in beiscsi_dev_probe() +- arm64: dts: rockchip: Re-add regulator-always-on for vcc_sdio for rk3399-roc-pc +- arm64: dts: rockchip: Re-add regulator-boot-on, regulator-always-on for vdd_gpu on rk3399-roc-pc +- firmware: turris-mox-rwtm: show message about HWRNG registration +- firmware: turris-mox-rwtm: fail probing when firmware does not support hwrng +- firmware: turris-mox-rwtm: report failures better +- firmware: turris-mox-rwtm: fix reply status decoding function +- thermal/drivers/rcar_gen3_thermal: Fix coefficient calculations +- ARM: dts: imx6q-dhcom: Add gpios pinctrl for i2c bus recovery +- ARM: dts: imx6q-dhcom: Fix ethernet plugin detection problems +- ARM: dts: imx6q-dhcom: Fix ethernet reset time properties +- thermal/drivers/sprd: Add missing MODULE_DEVICE_TABLE +- ARM: dts: am437x: align ti,pindir-d0-out-d1-in property with dt-shema +- ARM: dts: am335x: align ti,pindir-d0-out-d1-in property with dt-shema +- ARM: dts: dra7: Fix duplicate USB4 target module node +- arm64: dts: allwinner: a64-sopine-baseboard: change RGMII mode to TXID +- memory: fsl_ifc: fix leak of private memory on probe failure +- memory: fsl_ifc: fix leak of IO mapping on probe failure +- arm64: dts: ti: k3-j721e-main: Fix external refclk input to SERDES +- arm64: dts: renesas: r8a779a0: Drop power-domains property from GIC node +- reset: bail if try_module_get() fails +- ARM: dts: BCM5301X: Fixup SPI binding +- dt-bindings: i2c: at91: fix example for scl-gpios +- firmware: arm_scmi: Reset Rx buffer to max size during async commands +- firmware: tegra: Fix error return code in tegra210_bpmp_init() +- arm64: dts: qcom: trogdor: Add no-hpd to DSI bridge node +- ARM: dts: stm32: Rework LAN8710Ai PHY reset on DHCOM SoM +- ARM: dts: stm32: Connect PHY IRQ line on DH STM32MP1 SoM +- arm64: dts: renesas: r8a7796[01]: Fix OPP table entry voltages +- arm64: dts: renesas: Add missing opp-suspend properties +- arm64: dts: ti: j7200-main: Enable USB2 PHY RX sensitivity workaround +- ARM: dts: r8a7779, marzen: Fix DU clock names +- arm64: dts: renesas: v3msk: Fix memory size +- rtc: fix snprintf() checking in is_rtc_hctosys() +- ARM: dts: sun8i: h3: orangepi-plus: Fix ethernet phy-mode +- memory: pl353: Fix error return code in pl353_smc_probe() +- reset: brcmstb: Add missing MODULE_DEVICE_TABLE +- memory: atmel-ebi: add missing of_node_put for loop iteration +- memory: stm32-fmc2-ebi: add missing of_node_put for loop iteration +- ARM: dts: exynos: fix PWM LED max brightness on Odroid XU4 +- ARM: dts: exynos: fix PWM LED max brightness on Odroid HC1 +- ARM: dts: exynos: fix PWM LED max brightness on Odroid XU/XU3 +- ARM: exynos: add missing of_node_put for loop iteration +- reset: a10sr: add missing of_match_table reference +- reset: RESET_INTEL_GW should depend on X86 +- reset: RESET_BRCMSTB_RESCAL should depend on ARCH_BRCMSTB +- ARM: dts: gemini-rut1xx: remove duplicate ethernet node +- hexagon: use common DISCARDS macro +- hexagon: handle {,SOFT}IRQENTRY_TEXT in linker script +- NFSv4/pNFS: Don't call _nfs4_pnfs_v3_ds_connect multiple times +- NFSv4/pnfs: Fix layoutget behaviour after invalidation +- NFSv4/pnfs: Fix the layout barrier update +- vdpa/mlx5: Clear vq ready indication upon device reset +- ALSA: isa: Fix error return code in snd_cmi8330_probe() +- nfsd: Reduce contention for the nfsd_file nf_rwsem +- nvme-tcp: can't set sk_user_data without write_lock +- virtio_net: move tx vq operation under tx queue lock +- vdpa/mlx5: Fix possible failure in umem size calculation +- vdpa/mlx5: Fix umem sizes assignments on VQ create +- PCI: tegra194: Fix tegra_pcie_ep_raise_msi_irq() ill-defined shift +- pwm: imx1: Don't disable clocks at device remove time +- PCI: intel-gw: Fix INTx enable +- x86/fpu: Limit xstate copy size in xstateregs_set() +- x86/fpu: Fix copy_xstate_to_kernel() gap handling +- f2fs: fix to avoid adding tab before doc section +- PCI: iproc: Support multi-MSI only on uniprocessor kernel +- PCI: iproc: Fix multi-MSI base vector number allocation +- ubifs: Set/Clear I_LINKABLE under i_lock for whiteout inode +- nfs: fix acl memory leak of posix_acl_create() +- SUNRPC: prevent port reuse on transports which don't request it. +- watchdog: jz4740: Fix return value check in jz4740_wdt_probe() +- watchdog: aspeed: fix hardware timeout calculation +- ubifs: journal: Fix error return code in ubifs_jnl_write_inode() +- ubifs: Fix off-by-one error +- um: fix error return code in winch_tramp() +- um: fix error return code in slip_open() +- misc: alcor_pci: fix inverted branch condition +- NFSv4: Fix an Oops in pnfs_mark_request_commit() when doing O_DIRECT +- NFSv4: Initialise connection to the server in nfs4_alloc_client() +- power: supply: rt5033_battery: Fix device tree enumeration +- PCI/sysfs: Fix dsm_label_utf16s_to_utf8s() buffer overrun +- remoteproc: k3-r5: Fix an error message +- f2fs: compress: fix to disallow temp extension +- f2fs: add MODULE_SOFTDEP to ensure crc32 is included in the initramfs +- x86/signal: Detect and prevent an alternate signal stack overflow +- NFSD: Fix TP_printk() format specifier in nfsd_clid_class +- f2fs: atgc: fix to set default age threshold +- virtio_console: Assure used length from device is limited +- virtio_net: Fix error handling in virtnet_restore() +- virtio-blk: Fix memory leak among suspend/resume procedure +- PCI: rockchip: Register IRQ handlers after device and data are ready +- ACPI: video: Add quirk for the Dell Vostro 3350 +- ACPI: AMBA: Fix resource name in /proc/iomem +- pwm: tegra: Don't modify HW state in .remove callback +- pwm: img: Fix PM reference leak in img_pwm_enable() +- drm/amdkfd: fix sysfs kobj leak +- power: supply: ab8500: add missing MODULE_DEVICE_TABLE +- power: supply: charger-manager: add missing MODULE_DEVICE_TABLE +- NFS: nfs_find_open_context() may only select open files +- drm/gma500: Add the missed drm_gem_object_put() in psb_user_framebuffer_create() +- ceph: remove bogus checks and WARN_ONs from ceph_set_page_dirty +- orangefs: fix orangefs df output. +- PCI: tegra: Add missing MODULE_DEVICE_TABLE +- remoteproc: core: Fix cdev remove and rproc del +- x86/fpu: Return proper error codes from user access functions +- watchdog: iTCO_wdt: Account for rebooting on second timeout +- watchdog: imx_sc_wdt: fix pretimeout +- watchdog: Fix possible use-after-free by calling del_timer_sync() +- watchdog: sc520_wdt: Fix possible use-after-free in wdt_turnoff() +- watchdog: Fix possible use-after-free in wdt_startup() +- PCI: pciehp: Ignore Link Down/Up caused by DPC +- NFSv4: Fix delegation return in cases where we have to retry +- PCI/P2PDMA: Avoid pci_get_slot(), which may sleep +- ARM: 9087/1: kprobes: test-thumb: fix for LLVM_IAS=1 +- power: reset: gpio-poweroff: add missing MODULE_DEVICE_TABLE +- power: supply: max17042: Do not enforce (incorrect) interrupt trigger type +- PCI: hv: Fix a race condition when removing the device +- power: supply: ab8500: Avoid NULL pointers +- PCI: ftpci100: Rename macro name collision +- pwm: spear: Don't modify HW state in .remove callback +- power: supply: sc2731_charger: Add missing MODULE_DEVICE_TABLE +- power: supply: sc27xx: Add missing MODULE_DEVICE_TABLE +- kcov: add __no_sanitize_coverage to fix noinstr for all architectures +- lib/decompress_unlz4.c: correctly handle zero-padding around initrds. +- phy: intel: Fix for warnings due to EMMC clock 175Mhz change in FIP +- i2c: core: Disable client irq on reboot/shutdown +- intel_th: Wait until port is in reset before programming it +- staging: rtl8723bs: fix macro value for 2.4Ghz only device +- leds: turris-omnia: add missing MODULE_DEVICE_TABLE +- ALSA: firewire-motu: fix detection for S/PDIF source on optical interface in v2 protocol +- ALSA: usb-audio: scarlett2: Fix 6i6 Gen 2 line out descriptions +- ALSA: hda: Add IRQ check for platform_get_irq() +- backlight: lm3630a: Fix return code of .update_status() callback +- ASoC: Intel: kbl_da7219_max98357a: shrink platform_id below 20 characters +- powerpc/boot: Fixup device-tree on little endian +- usb: gadget: hid: fix error return code in hid_bind() +- usb: gadget: f_hid: fix endianness issue with descriptors +- ALSA: usb-audio: scarlett2: Fix scarlett2_*_ctl_put() return values +- ALSA: usb-audio: scarlett2: Fix data_mutex lock +- ALSA: usb-audio: scarlett2: Fix 18i8 Gen 2 PCM Input count +- ALSA: bebob: add support for ToneWeal FW66 +- Input: hideep - fix the uninitialized use in hideep_nvm_unlock() +- s390/mem_detect: fix tprot() program check new psw handling +- s390/mem_detect: fix diag260() program check new psw handling +- s390/ipl_parm: fix program check new psw handling +- s390/processor: always inline stap() and __load_psw_mask() +- habanalabs: remove node from list before freeing the node +- habanalabs/gaudi: set the correct cpu_id on MME2_QM failure +- ASoC: soc-core: Fix the error return code in snd_soc_of_parse_audio_routing() +- powerpc/mm/book3s64: Fix possible build error +- gpio: pca953x: Add support for the On Semi pca9655 +- selftests/powerpc: Fix "no_handler" EBB selftest +- ALSA: ppc: fix error return code in snd_pmac_probe() +- scsi: storvsc: Correctly handle multiple flags in srb_status +- gpio: zynq: Check return value of irq_get_irq_data +- gpio: zynq: Check return value of pm_runtime_get_sync +- ASoC: soc-pcm: fix the return value in dpcm_apply_symmetry() +- iommu/arm-smmu: Fix arm_smmu_device refcount leak in address translation +- iommu/arm-smmu: Fix arm_smmu_device refcount leak when arm_smmu_rpm_get fails +- powerpc/ps3: Add dma_mask to ps3_dma_region +- ALSA: sb: Fix potential double-free of CSP mixer elements +- selftests: timers: rtcpie: skip test if default RTC device does not exist +- s390: disable SSP when needed +- s390/sclp_vt220: fix console name to match device +- serial: tty: uartlite: fix console setup +- fsi: Add missing MODULE_DEVICE_TABLE +- ASoC: img: Fix PM reference leak in img_i2s_in_probe() +- mfd: cpcap: Fix cpcap dmamask not set warnings +- mfd: da9052/stmpe: Add and modify MODULE_DEVICE_TABLE +- scsi: qedi: Fix cleanup session block/unblock use +- scsi: qedi: Fix TMF session block/unblock use +- scsi: qedi: Fix race during abort timeouts +- scsi: qedi: Fix null ref during abort handling +- scsi: iscsi: Fix shost->max_id use +- scsi: iscsi: Fix conn use after free during resets +- scsi: iscsi: Add iscsi_cls_conn refcount helpers +- scsi: megaraid_sas: Handle missing interrupts while re-enabling IRQs +- scsi: megaraid_sas: Early detection of VD deletion through RaidMap update +- scsi: megaraid_sas: Fix resource leak in case of probe failure +- fs/jfs: Fix missing error code in lmLogInit() +- scsi: scsi_dh_alua: Check for negative result value +- scsi: core: Fixup calling convention for scsi_mode_sense() +- scsi: mpt3sas: Fix deadlock while cancelling the running firmware event +- tty: serial: 8250: serial_cs: Fix a memory leak in error handling path +- ALSA: ac97: fix PM reference leak in ac97_bus_remove() +- scsi: core: Cap scsi_host cmd_per_lun at can_queue +- scsi: lpfc: Fix crash when lpfc_sli4_hba_setup() fails to initialize the SGLs +- scsi: lpfc: Fix "Unexpected timeout" error in direct attach topology +- scsi: arcmsr: Fix doorbell status being updated late on ARC-1886 +- w1: ds2438: fixing bug that would always get page0 +- usb: common: usb-conn-gpio: fix NULL pointer dereference of charger +- Revert "ALSA: bebob/oxfw: fix Kconfig entry for Mackie d.2 Pro" +- ALSA: usx2y: Don't call free_pages_exact() with NULL address +- ALSA: usx2y: Avoid camelCase +- iio: magn: bmc150: Balance runtime pm + use pm_runtime_resume_and_get() +- iio: gyro: fxa21002c: Balance runtime pm + use pm_runtime_resume_and_get(). +- partitions: msdos: fix one-byte get_unaligned() +- ASoC: intel/boards: add missing MODULE_DEVICE_TABLE +- misc: alcor_pci: fix null-ptr-deref when there is no PCI bridge +- misc/libmasm/module: Fix two use after free in ibmasm_init_one +- serial: fsl_lpuart: disable DMA for console and fix sysrq +- tty: serial: fsl_lpuart: fix the potential risk of division or modulo by zero +- rcu: Reject RCU_LOCKDEP_WARN() false positives +- srcu: Fix broken node geometry after early ssp init +- scsi: arcmsr: Fix the wrong CDB payload report to IOP +- dmaengine: fsl-qdma: check dma_set_mask return value +- ASoC: Intel: sof_sdw: add mutual exclusion between PCH DMIC and RT715 +- leds: tlc591xx: fix return value check in tlc591xx_probe() +- net: bridge: multicast: fix MRD advertisement router port marking race +- net: bridge: multicast: fix PIM hello router port marking race +- Revert "drm/ast: Remove reference to struct drm_device.pdev" +- drm/ingenic: Switch IPU plane to type OVERLAY +- drm/ingenic: Fix non-OSD mode +- drm/dp_mst: Add missing drm parameters to recently added call to drm_dbg_kms() +- drm/dp_mst: Avoid to mess up payload table by ports in stale topology +- drm/dp_mst: Do not set proposed vcpi directly +- fbmem: Do not delete the mode that is still in use +- cgroup: verify that source is a string +- drm/i915/gt: Fix -EDEADLK handling regression +- drm/i915/gtt: drop the page table optimisation +- tracing: Do not reference char * as a string in histograms +- scsi: zfcp: Report port fc_security as unknown early during remote cable pull +- scsi: core: Fix bad pointer dereference when ehandler kthread is invalid +- KVM: X86: Disable hardware breakpoints unconditionally before kvm_x86->run() +- KVM: nSVM: Check the value written to MSR_VM_HSAVE_PA +- KVM: x86/mmu: Do not apply HPA (memory encryption) mask to GPAs +- KVM: x86: Use guest MAXPHYADDR from CPUID.0x8000_0008 iff TDP is enabled +- KVM: mmio: Fix use-after-free Read in kvm_vm_ioctl_unregister_coalesced_mmio +- cifs: handle reconnect of tcon when there is no cached dfs referral +- certs: add 'x509_revocation_list' to gitignore +- f2fs: fix to avoid racing on fsync_entry_slab by multi filesystem instances +- smackfs: restrict bytes count in smk_set_cipso() +- jfs: fix GPF in diFree +- drm/ast: Remove reference to struct drm_device.pdev +- pinctrl: mcp23s08: Fix missing unlock on error in mcp23s08_irq() +- dm writecache: write at least 4k when committing +- io_uring: fix clear IORING_SETUP_R_DISABLED in wrong function +- media: uvcvideo: Fix pixel format change for Elgato Cam Link 4K +- media: gspca/sunplus: fix zero-length control requests +- media: gspca/sq905: fix control-request direction +- media: zr364xx: fix memory leak in zr364xx_start_readpipe +- media: dtv5100: fix control-request directions +- media: subdev: disallow ioctl for saa6588/davinci +- PCI: aardvark: Implement workaround for the readback value of VEND_ID +- PCI: aardvark: Fix checking for PIO Non-posted Request +- PCI: Leave Apple Thunderbolt controllers on for s2idle or standby +- dm writecache: flush origin device when writing and cache is full +- dm zoned: check zone capacity +- coresight: tmc-etf: Fix global-out-of-bounds in tmc_update_etf_buffer() +- coresight: Propagate symlink failure +- ipack/carriers/tpci200: Fix a double free in tpci200_pci_probe +- tracing: Resize tgid_map to pid_max, not PID_MAX_DEFAULT +- tracing: Simplify & fix saved_tgids logic +- rq-qos: fix missed wake-ups in rq_qos_throttle try two +- seq_buf: Fix overflow in seq_buf_putmem_hex() +- extcon: intel-mrfld: Sync hardware and software state on init +- selftests/lkdtm: Fix expected text for CR4 pinning +- lkdtm/bugs: XFAIL UNALIGNED_LOAD_STORE_WRITE +- nvmem: core: add a missing of_node_put +- mfd: syscon: Free the allocated name field of struct regmap_config +- power: supply: ab8500: Fix an old bug +- thermal/drivers/int340x/processor_thermal: Fix tcc setting +- ipmi/watchdog: Stop watchdog timer when the current action is 'none' +- qemu_fw_cfg: Make fw_cfg_rev_attr a proper kobj_attribute +- i40e: fix PTP on 5Gb links +- ASoC: tegra: Set driver_name=tegra for all machine drivers +- fpga: stratix10-soc: Add missing fpga_mgr_free() call +- clocksource/arm_arch_timer: Improve Allwinner A64 timer workaround +- cpu/hotplug: Cure the cpusets trainwreck +- arm64: tlb: fix the TTL value of tlb_get_level +- ata: ahci_sunxi: Disable DIPM +- mmc: core: Allow UHS-I voltage switch for SDSC cards if supported +- mmc: core: clear flags before allowing to retune +- mmc: sdhci: Fix warning message when accessing RPMB in HS400 mode +- mmc: sdhci-acpi: Disable write protect detection on Toshiba Encore 2 WT8-B +- drm/i915/display: Do not zero past infoframes.vsc +- drm/nouveau: Don't set allow_fb_modifiers explicitly +- drm/arm/malidp: Always list modifiers +- drm/msm/mdp4: Fix modifier support enabling +- drm/tegra: Don't set allow_fb_modifiers explicitly +- drm/amd/display: Reject non-zero src_y and src_x for video planes +- pinctrl/amd: Add device HID for new AMD GPIO controller +- drm/amd/display: fix incorrrect valid irq check +- drm/rockchip: dsi: remove extra component_del() call +- drm/dp: Handle zeroed port counts in drm_dp_read_downstream_info() +- drm/vc4: hdmi: Prevent clock unbalance +- drm/vc4: crtc: Skip the TXP +- drm/vc4: txp: Properly set the possible_crtcs mask +- drm/radeon: Call radeon_suspend_kms() in radeon_pci_shutdown() for Loongson64 +- drm/radeon: Add the missed drm_gem_object_put() in radeon_user_framebuffer_create() +- drm/amdgpu: enable sdma0 tmz for Raven/Renoir(V2) +- drm/amdgpu: Update NV SIMD-per-CU to 2 +- powerpc/powernv/vas: Release reference to tgid during window close +- powerpc/barrier: Avoid collision with clang's __lwsync macro +- powerpc/mm: Fix lockup on kernel exec fault +- arm64: dts: rockchip: Enable USB3 for rk3328 Rock64 +- arm64: dts: rockchip: add rk3328 dwc3 usb controller node +- ath11k: unlock on error path in ath11k_mac_op_add_interface() +- MIPS: MT extensions are not available on MIPS32r1 +- selftests/resctrl: Fix incorrect parsing of option "-t" +- MIPS: set mips32r5 for virt extensions +- MIPS: loongsoon64: Reserve memory below starting pfn to prevent Oops +- sctp: add size validation when walking chunks +- sctp: validate from_addr_param return +- flow_offload: action should not be NULL when it is referenced +- bpf: Fix false positive kmemleak report in bpf_ringbuf_area_alloc() +- sched/fair: Ensure _sum and _avg values stay consistent +- Bluetooth: btusb: fix bt fiwmare downloading failure issue for qca btsoc. +- Bluetooth: mgmt: Fix the command returns garbage parameter value +- Bluetooth: btusb: Add support USB ALT 3 for WBS +- Bluetooth: L2CAP: Fix invalid access on ECRED Connection response +- Bluetooth: L2CAP: Fix invalid access if ECRED Reconfigure fails +- Bluetooth: btusb: Add a new QCA_ROME device (0cf3:e500) +- Bluetooth: Shutdown controller after workqueues are flushed or cancelled +- Bluetooth: Fix alt settings for incoming SCO with transparent coding format +- Bluetooth: Fix the HCI to MGMT status conversion table +- Bluetooth: btusb: Fixed too many in-token issue for Mediatek Chip. +- RDMA/cma: Fix rdma_resolve_route() memory leak +- net: ip: avoid OOM kills with large UDP sends over loopback +- media, bpf: Do not copy more entries than user space requested +- IB/isert: Align target max I/O size to initiator size +- mac80211_hwsim: add concurrent channels scanning support over virtio +- mac80211: consider per-CPU statistics if present +- cfg80211: fix default HE tx bitrate mask in 2G band +- wireless: wext-spy: Fix out-of-bounds warning +- sfc: error code if SRIOV cannot be disabled +- sfc: avoid double pci_remove of VFs +- iwlwifi: pcie: fix context info freeing +- iwlwifi: pcie: free IML DMA memory allocation +- iwlwifi: mvm: fix error print when session protection ends +- iwlwifi: mvm: don't change band on bound PHY contexts +- RDMA/rxe: Don't overwrite errno from ib_umem_get() +- vsock: notify server to shutdown when client has pending signal +- atm: nicstar: register the interrupt handler in the right place +- atm: nicstar: use 'dma_free_coherent' instead of 'kfree' +- net: fec: add ndo_select_queue to fix TX bandwidth fluctuations +- MIPS: add PMD table accounting into MIPS'pmd_alloc_one +- rtl8xxxu: Fix device info for RTL8192EU devices +- mt76: mt7915: fix IEEE80211_HE_PHY_CAP7_MAX_NC for station mode +- drm/amdkfd: Walk through list with dqm lock hold +- drm/amdgpu: fix bad address translation for sienna_cichlid +- io_uring: fix false WARN_ONCE +- net: sched: fix error return code in tcf_del_walker() +- net: ipa: Add missing of_node_put() in ipa_firmware_load() +- net: fix mistake path for netdev_features_strings +- mt76: mt7615: fix fixed-rate tx status reporting +- ice: mark PTYPE 2 as reserved +- ice: fix incorrect payload indicator on PTYPE +- bpf: Fix up register-based shifts in interpreter to silence KUBSAN +- drm/amdkfd: Fix circular lock in nocpsch path +- drm/amdkfd: fix circular locking on get_wave_state +- cw1200: add missing MODULE_DEVICE_TABLE +- wl1251: Fix possible buffer overflow in wl1251_cmd_scan +- wlcore/wl12xx: Fix wl12xx get_mac error if device is in ELP +- dm writecache: commit just one block, not a full page +- xfrm: Fix error reporting in xfrm_state_construct. +- drm/amd/display: Verify Gamma & Degamma LUT sizes in amdgpu_dm_atomic_check +- r8169: avoid link-up interrupt issue on RTL8106e if user enables ASPM +- selinux: use __GFP_NOWARN with GFP_NOWAIT in the AVC +- fjes: check return value after calling platform_get_resource() +- drm/amdkfd: use allowed domain for vmbo validation +- net: sgi: ioc3-eth: check return value after calling platform_get_resource() +- selftests: Clean forgotten resources as part of cleanup() +- net: phy: realtek: add delay to fix RXC generation issue +- drm/amd/display: Fix off-by-one error in DML +- drm/amd/display: Set DISPCLK_MAX_ERRDET_CYCLES to 7 +- drm/amd/display: Release MST resources on switch from MST to SST +- drm/amd/display: Update scaling settings on modeset +- drm/amd/display: Fix DCN 3.01 DSCCLK validation +- net: moxa: Use devm_platform_get_and_ioremap_resource() +- net: micrel: check return value after calling platform_get_resource() +- net: mvpp2: check return value after calling platform_get_resource() +- net: bcmgenet: check return value after calling platform_get_resource() +- net: mscc: ocelot: check return value after calling platform_get_resource() +- virtio_net: Remove BUG() to avoid machine dead +- ice: fix clang warning regarding deadcode.DeadStores +- ice: set the value of global config lock timeout longer +- pinctrl: mcp23s08: fix race condition in irq handler +- net: bridge: mrp: Update ring transitions. +- dm: Fix dm_accept_partial_bio() relative to zone management commands +- dm writecache: don't split bios when overwriting contiguous cache content +- dm space maps: don't reset space map allocation cursor when committing +- RDMA/cxgb4: Fix missing error code in create_qp() +- net: tcp better handling of reordering then loss cases +- drm/amdgpu: remove unsafe optimization to drop preamble ib +- drm/amd/display: Avoid HDCP over-read and corruption +- MIPS: ingenic: Select CPU_SUPPORTS_CPUFREQ && MIPS_EXTERNAL_TIMER +- MIPS: cpu-probe: Fix FPU detection on Ingenic JZ4760(B) +- ipv6: use prandom_u32() for ID generation +- virtio-net: Add validation for used length +- drm: bridge: cdns-mhdp8546: Fix PM reference leak in +- clk: tegra: Ensure that PLLU configuration is applied properly +- clk: tegra: Fix refcounting of gate clocks +- RDMA/rtrs: Change MAX_SESS_QUEUE_DEPTH +- net: stmmac: the XPCS obscures a potential "PHY not found" error +- drm: rockchip: add missing registers for RK3066 +- drm: rockchip: add missing registers for RK3188 +- net/mlx5: Fix lag port remapping logic +- net/mlx5e: IPsec/rep_tc: Fix rep_tc_update_skb drops IPsec packet +- clk: renesas: r8a77995: Add ZA2 clock +- drm/bridge: cdns: Fix PM reference leak in cdns_dsi_transfer() +- igb: fix assignment on big endian machines +- igb: handle vlan types with checker enabled +- e100: handle eeprom as little endian +- drm/vc4: hdmi: Fix PM reference leak in vc4_hdmi_encoder_pre_crtc_co() +- drm/vc4: Fix clock source for VEC PixelValve on BCM2711 +- udf: Fix NULL pointer dereference in udf_symlink function +- drm/sched: Avoid data corruptions +- drm/scheduler: Fix hang when sched_entity released +- pinctrl: equilibrium: Add missing MODULE_DEVICE_TABLE +- net/sched: cls_api: increase max_reclassify_loop +- net: mdio: provide shim implementation of devm_of_mdiobus_register +- drm/virtio: Fix double free on probe failure +- reiserfs: add check for invalid 1st journal block +- drm/bridge: lt9611: Add missing MODULE_DEVICE_TABLE +- net: mdio: ipq8064: add regmap config to disable REGCACHE +- drm/mediatek: Fix PM reference leak in mtk_crtc_ddp_hw_init() +- net: Treat __napi_schedule_irqoff() as __napi_schedule() on PREEMPT_RT +- atm: nicstar: Fix possible use-after-free in nicstar_cleanup() +- mISDN: fix possible use-after-free in HFC_cleanup() +- atm: iphase: fix possible use-after-free in ia_module_exit() +- hugetlb: clear huge pte during flush function on mips platform +- clk: renesas: rcar-usb2-clock-sel: Fix error handling in .probe() +- drm/amd/display: fix use_max_lb flag for 420 pixel formats +- net: pch_gbe: Use proper accessors to BE data in pch_ptp_match() +- drm/bridge: nwl-dsi: Force a full modeset when crtc_state->active is changed to be true +- drm/vc4: fix argument ordering in vc4_crtc_get_margins() +- drm/amd/amdgpu/sriov disable all ip hw status by default +- drm/amd/display: fix HDCP reset sequence on reinitialize +- drm/ast: Fixed CVE for DP501 +- drm/zte: Don't select DRM_KMS_FB_HELPER +- drm/mxsfb: Don't select DRM_KMS_FB_HELPER +- perf data: Close all files in close_dir() +- perf test bpf: Free obj_buf +- perf probe-file: Delete namelist in del_events() on the error path +- igmp: Add ip_mc_list lock in ip_check_mc_rcu +- ACPI / PPTT: get PPTT table in the first beginning +- Revert "[Huawei] sched: export sched_setscheduler symbol" +- kcsan: Never set up watchpoints on NULL pointers +- ext4: inline jbd2_journal_[un]register_shrinker() +- jbd2: export jbd2_journal_[un]register_shrinker() +- fs: remove bdev_try_to_free_page callback +- ext4: remove bdev_try_to_free_page() callback +- jbd2: simplify journal_clean_one_cp_list() +- jbd2,ext4: add a shrinker to release checkpointed buffers +- jbd2: remove redundant buffer io error checks +- jbd2: don't abort the journal when freeing buffers +- jbd2: ensure abort the journal if detect IO error when writing original buffer back +- jbd2: remove the out label in __jbd2_journal_remove_checkpoint() +- net: spnic: add NIC layer +- net: spnic: initial commit the common module of Ramaxel NIC driver +- spraid: Add CONFIG_RAMAXEL_SPRAID in defconfig of arch arm64 and x86 +- spraid: support Ramaxel raid controller +- powerpc/preempt: Don't touch the idle task's preempt_count during hotplug +- iommu/dma: Fix compile warning in 32-bit builds +- cred: add missing return error code when set_cred_ucounts() failed +- s390: preempt: Fix preempt_count initialization +- crypto: qce - fix error return code in qce_skcipher_async_req_handle() +- scsi: core: Retry I/O for Notify (Enable Spinup) Required error +- media: exynos4-is: remove a now unused integer +- mmc: vub3000: fix control-request direction +- mmc: block: Disable CMDQ on the ioctl path +- io_uring: fix blocking inline submission +- block: return the correct bvec when checking for gaps +- erofs: fix error return code in erofs_read_superblock() +- tpm: Replace WARN_ONCE() with dev_err_once() in tpm_tis_status() +- fscrypt: fix derivation of SipHash keys on big endian CPUs +- fscrypt: don't ignore minor_hash when hash is 0 +- mailbox: qcom-ipcc: Fix IPCC mbox channel exhaustion +- scsi: target: cxgbit: Unmap DMA buffer before calling target_execute_cmd() +- scsi: fc: Correct RHBA attributes length +- exfat: handle wrong stream entry size in exfat_readdir() +- csky: syscache: Fixup duplicate cache flush +- csky: fix syscache.c fallthrough warning +- perf llvm: Return -ENOMEM when asprintf() fails +- selftests/vm/pkeys: refill shadow register after implicit kernel write +- selftests/vm/pkeys: handle negative sys_pkey_alloc() return code +- selftests/vm/pkeys: fix alloc_random_pkey() to make it really, really random +- lib/math/rational.c: fix divide by zero +- mm/z3fold: use release_z3fold_page_locked() to release locked z3fold page +- mm/z3fold: fix potential memory leak in z3fold_destroy_pool() +- include/linux/huge_mm.h: remove extern keyword +- hugetlb: remove prep_compound_huge_page cleanup +- mm/hugetlb: remove redundant check in preparing and destroying gigantic page +- mm/hugetlb: use helper huge_page_order and pages_per_huge_page +- mm/huge_memory.c: don't discard hugepage if other processes are mapping it +- mm/huge_memory.c: add missing read-only THP checking in transparent_hugepage_enabled() +- mm/huge_memory.c: remove dedicated macro HPAGE_CACHE_INDEX_MASK +- mm/pmem: avoid inserting hugepage PTE entry with fsdax if hugepage support is disabled +- vfio/pci: Handle concurrent vma faults +- arm64: dts: marvell: armada-37xx: Fix reg for standard variant of UART +- serial: mvebu-uart: correctly calculate minimal possible baudrate +- serial: mvebu-uart: do not allow changing baudrate when uartclk is not available +- ALSA: firewire-lib: Fix 'amdtp_domain_start()' when no AMDTP_OUT_STREAM stream is found +- powerpc/papr_scm: Make 'perf_stats' invisible if perf-stats unavailable +- powerpc/64s: Fix copy-paste data exposure into newly created tasks +- powerpc/papr_scm: Properly handle UUID types and API +- powerpc: Offline CPU in stop_this_cpu() +- serial: 8250: 8250_omap: Fix possible interrupt storm on K3 SoCs +- serial: 8250: 8250_omap: Disable RX interrupt after DMA enable +- selftests/ftrace: fix event-no-pid on 1-core machine +- leds: ktd2692: Fix an error handling path +- leds: as3645a: Fix error return code in as3645a_parse_node() +- ASoC: fsl_spdif: Fix unexpected interrupt after suspend +- ASoC: Intel: sof_sdw: add SOF_RT715_DAI_ID_FIX for AlderLake +- ASoC: atmel-i2s: Fix usage of capture and playback at the same time +- powerpc/powernv: Fix machine check reporting of async store errors +- extcon: max8997: Add missing modalias string +- extcon: sm5502: Drop invalid register write in sm5502_reg_data +- phy: ti: dm816x: Fix the error handling path in 'dm816x_usb_phy_probe() +- phy: uniphier-pcie: Fix updating phy parameters +- soundwire: stream: Fix test for DP prepare complete +- scsi: mpt3sas: Fix error return value in _scsih_expander_add() +- habanalabs: Fix an error handling path in 'hl_pci_probe()' +- mtd: rawnand: marvell: add missing clk_disable_unprepare() on error in marvell_nfc_resume() +- of: Fix truncation of memory sizes on 32-bit platforms +- ASoC: cs42l42: Correct definition of CS42L42_ADC_PDN_MASK +- iio: prox: isl29501: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: light: vcnl4035: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- serial: 8250: Actually allow UPF_MAGIC_MULTIPLIER baud rates +- staging: mt7621-dts: fix pci address for PCI memory range +- coresight: core: Fix use of uninitialized pointer +- staging: rtl8712: fix memory leak in rtl871x_load_fw_cb +- staging: rtl8712: fix error handling in r871xu_drv_init +- staging: gdm724x: check for overflow in gdm_lte_netif_rx() +- staging: gdm724x: check for buffer overflow in gdm_lte_multi_sdu_pkt() +- ASoC: fsl_spdif: Fix error handler with pm_runtime_enable +- iio: light: vcnl4000: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: magn: rm3100: Fix alignment of buffer in iio_push_to_buffers_with_timestamp() +- iio: adc: ti-ads8688: Fix alignment of buffer in iio_push_to_buffers_with_timestamp() +- iio: adc: mxs-lradc: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: adc: hx711: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: adc: at91-sama5d2: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- thunderbolt: Bond lanes only when dual_link_port != NULL in alloc_dev_default() +- eeprom: idt_89hpesx: Restore printing the unsupported fwnode name +- eeprom: idt_89hpesx: Put fwnode in matching case during ->probe() +- usb: dwc2: Don't reset the core after setting turnaround time +- usb: gadget: f_fs: Fix setting of device and driver data cross-references +- ASoC: mediatek: mtk-btcvsd: Fix an error handling path in 'mtk_btcvsd_snd_probe()' +- ASoC: rt5682-sdw: set regcache_cache_only false before reading RT5682_DEVICE_ID +- ASoC: rt5682: fix getting the wrong device id when the suspend_stress_test +- ASoC: rt715-sdw: use first_hw_init flag on resume +- ASoC: rt711-sdw: use first_hw_init flag on resume +- ASoC: rt700-sdw: use first_hw_init flag on resume +- ASoC: rt5682-sdw: use first_hw_init flag on resume +- ASoC: rt1308-sdw: use first_hw_init flag on resume +- ASoC: max98373-sdw: use first_hw_init flag on resume +- iommu/dma: Fix IOVA reserve dma ranges +- selftests: splice: Adjust for handler fallback removal +- s390: appldata depends on PROC_SYSCTL +- s390: enable HAVE_IOREMAP_PROT +- s390/irq: select HAVE_IRQ_EXIT_ON_IRQ_STACK +- iommu/amd: Fix extended features logging +- visorbus: fix error return code in visorchipset_init() +- fsi/sbefifo: Fix reset timeout +- fsi/sbefifo: Clean up correct FIFO when receiving reset request from SBE +- fsi: occ: Don't accept response from un-initialized OCC +- fsi: scom: Reset the FSI2PIB engine for any error +- fsi: core: Fix return of error values on failures +- mfd: rn5t618: Fix IRQ trigger by changing it to level mode +- mfd: mp2629: Select MFD_CORE to fix build error +- scsi: iscsi: Flush block work before unblock +- scsi: FlashPoint: Rename si_flags field +- leds: lp50xx: Put fwnode in error case during ->probe() +- leds: lm3697: Don't spam logs when probe is deferred +- leds: lm3692x: Put fwnode in any case during ->probe() +- leds: lm36274: Put fwnode in error case during ->probe() +- leds: lm3532: select regmap I2C API +- leds: class: The -ENOTSUPP should never be seen by user space +- tty: nozomi: Fix the error handling path of 'nozomi_card_init()' +- firmware: stratix10-svc: Fix a resource leak in an error handling path +- char: pcmcia: error out if 'num_bytes_read' is greater than 4 in set_protocol() +- staging: mmal-vchiq: Fix incorrect static vchiq_instance. +- mtd: rawnand: arasan: Ensure proper configuration for the asserted target +- mtd: partitions: redboot: seek fis-index-block in the right node +- perf scripting python: Fix tuple_set_u64() +- Input: hil_kbd - fix error return code in hil_dev_connect() +- ASoC: rsnd: tidyup loop on rsnd_adg_clk_query() +- backlight: lm3630a_bl: Put fwnode in error case during ->probe() +- ASoC: hisilicon: fix missing clk_disable_unprepare() on error in hi6210_i2s_startup() +- ASoC: rk3328: fix missing clk_disable_unprepare() on error in rk3328_platform_probe() +- iio: potentiostat: lmp91000: Fix alignment of buffer in iio_push_to_buffers_with_timestamp() +- iio: cros_ec_sensors: Fix alignment of buffer in iio_push_to_buffers_with_timestamp() +- iio: chemical: atlas: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: light: tcs3472: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: light: tcs3414: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: light: isl29125: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: magn: bmc150: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: magn: hmc5843: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: prox: as3935: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: prox: pulsed-light: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: prox: srf08: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: humidity: am2315: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: gyro: bmg160: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: adc: vf610: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: adc: ti-ads1015: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: accel: stk8ba50: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: accel: stk8312: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: accel: mxc4005: Fix overread of data and alignment issue. +- iio: accel: kxcjk-1013: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: accel: hid: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: accel: bma220: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: accel: bma180: Fix buffer alignment in iio_push_to_buffers_with_timestamp() +- iio: adis16475: do not return ints in irq handlers +- iio: adis16400: do not return ints in irq handlers +- iio: adis_buffer: do not return ints in irq handlers +- mwifiex: re-fix for unaligned accesses +- tty: nozomi: Fix a resource leak in an error handling function +- serial: 8250_omap: fix a timeout loop condition +- serial: fsl_lpuart: remove RTSCTS handling from get_mctrl() +- serial: fsl_lpuart: don't modify arbitrary data on lpuart32 +- rcu: Invoke rcu_spawn_core_kthreads() from rcu_spawn_gp_kthread() +- ASoC: rt5682: Disable irq on shutdown +- staging: fbtft: Don't spam logs when probe is deferred +- staging: fbtft: Rectify GPIO handling +- MIPS: Fix PKMAP with 32-bit MIPS huge page support +- RDMA/core: Always release restrack object +- RDMA/mlx5: Don't access NULL-cleared mpi pointer +- net: tipc: fix FB_MTU eat two pages +- net: sched: fix warning in tcindex_alloc_perfect_hash +- net: lwtunnel: handle MTU calculation in forwading +- writeback: fix obtain a reference to a freeing memcg css +- clk: si5341: Update initialization magic +- clk: si5341: Check for input clock presence and PLL lock on startup +- clk: si5341: Avoid divide errors due to bogus register contents +- clk: si5341: Wait for DEVICE_READY on startup +- clk: qcom: clk-alpha-pll: fix CAL_L write in alpha_pll_fabia_prepare +- clk: actions: Fix AHPPREDIV-H-AHB clock chain on Owl S500 SoC +- clk: actions: Fix bisp_factor_table based clocks on Owl S500 SoC +- clk: actions: Fix SD clocks factor table on Owl S500 SoC +- clk: actions: Fix UART clock dividers on Owl S500 SoC +- Bluetooth: Fix handling of HCI_LE_Advertising_Set_Terminated event +- Bluetooth: Fix Set Extended (Scan Response) Data +- Bluetooth: Fix not sending Set Extended Scan Response +- Bluetooth: mgmt: Fix slab-out-of-bounds in tlv_data_is_valid +- Revert "be2net: disable bh with spin_lock in be_process_mcc" +- gve: Fix swapped vars when fetching max queues +- RDMA/cma: Fix incorrect Packet Lifetime calculation +- bpfilter: Specify the log level for the kmsg message +- net: dsa: sja1105: fix NULL pointer dereference in sja1105_reload_cbs() +- e1000e: Check the PCIm state +- ipv6: fix out-of-bound access in ip6_parse_tlv() +- net: atlantic: fix the macsec key length +- net: phy: mscc: fix macsec key length +- net: macsec: fix the length used to copy the key for offloading +- RDMA/cma: Protect RMW with qp_mutex +- ibmvnic: free tx_pool if tso_pool alloc fails +- ibmvnic: set ltb->buff to NULL after freeing +- Revert "ibmvnic: remove duplicate napi_schedule call in open function" +- i40e: Fix missing rtnl locking when setting up pf switch +- i40e: Fix autoneg disabling for non-10GBaseT links +- i40e: Fix error handling in i40e_vsi_open +- bpf: Do not change gso_size during bpf_skb_change_proto() +- can: j1939: j1939_sk_setsockopt(): prevent allocation of j1939 filter for optlen == 0 +- ipv6: exthdrs: do not blindly use init_net +- net: bcmgenet: Fix attaching to PYH failed on RPi 4B +- mac80211: remove iwlwifi specific workaround NDPs of null_response +- drm/msm/dpu: Fix error return code in dpu_mdss_init() +- drm/msm: Fix error return code in msm_drm_init() +- bpf: Fix null ptr deref with mixed tail calls and subprogs +- ieee802154: hwsim: avoid possible crash in hwsim_del_edge_nl() +- ieee802154: hwsim: Fix memory leak in hwsim_add_one +- tc-testing: fix list handling +- net: ti: am65-cpsw-nuss: Fix crash when changing number of TX queues +- net/ipv4: swap flow ports when validating source +- ip6_tunnel: fix GRE6 segmentation +- vxlan: add missing rcu_read_lock() in neigh_reduce() +- rtw88: 8822c: fix lc calibration timing +- iwlwifi: increase PNVM load timeout +- xfrm: Fix xfrm offload fallback fail case +- pkt_sched: sch_qfq: fix qfq_change_class() error path +- netfilter: nf_tables_offload: check FLOW_DISSECTOR_KEY_BASIC in VLAN transfer logic +- tls: prevent oversized sendfile() hangs by ignoring MSG_MORE +- net: sched: add barrier to ensure correct ordering for lockless qdisc +- vrf: do not push non-ND strict packets with a source LLA through packet taps again +- net: ethernet: ezchip: fix error handling +- net: ethernet: ezchip: fix UAF in nps_enet_remove +- net: ethernet: aeroflex: fix UAF in greth_of_remove +- mt76: mt7615: fix NULL pointer dereference in tx_prepare_skb() +- mt76: fix possible NULL pointer dereference in mt76_tx +- samples/bpf: Fix the error return code of xdp_redirect's main() +- samples/bpf: Fix Segmentation fault for xdp_redirect command +- RDMA/rtrs-srv: Set minimal max_send_wr and max_recv_wr +- bpf: Fix libelf endian handling in resolv_btfids +- xsk: Fix broken Tx ring validation +- xsk: Fix missing validation for skb and unaligned mode +- selftests/bpf: Whitelist test_progs.h from .gitignore +- RDMA/rxe: Fix qp reference counting for atomic ops +- netfilter: nft_tproxy: restrict support to TCP and UDP transport protocols +- netfilter: nft_osf: check for TCP packet before further processing +- netfilter: nft_exthdr: check for IPv6 packet before further processing +- RDMA/mlx5: Don't add slave port to unaffiliated list +- netlabel: Fix memory leak in netlbl_mgmt_add_common +- ath11k: send beacon template after vdev_start/restart during csa +- ath10k: Fix an error code in ath10k_add_interface() +- ath11k: Fix an error handling path in ath11k_core_fetch_board_data_api_n() +- cw1200: Revert unnecessary patches that fix unreal use-after-free bugs +- brcmsmac: mac80211_if: Fix a resource leak in an error handling path +- brcmfmac: Fix a double-free in brcmf_sdio_bus_reset +- brcmfmac: correctly report average RSSI in station info +- brcmfmac: fix setting of station info chains bitmask +- ssb: Fix error return code in ssb_bus_scan() +- wcn36xx: Move hal_buf allocation to devm_kmalloc in probe +- clk: imx8mq: remove SYS PLL 1/2 clock gates +- ieee802154: hwsim: Fix possible memory leak in hwsim_subscribe_all_others +- wireless: carl9170: fix LEDS build errors & warnings +- ath10k: add missing error return code in ath10k_pci_probe() +- ath10k: go to path err_unsupported when chip id is not supported +- tools/bpftool: Fix error return code in do_batch() +- drm: qxl: ensure surf.data is ininitialized +- clk: vc5: fix output disabling when enabling a FOD +- drm/vc4: hdmi: Fix error path of hpd-gpios +- drm/pl111: Actually fix CONFIG_VEXPRESS_CONFIG depends +- RDMA/rxe: Fix failure during driver load +- drm/pl111: depend on CONFIG_VEXPRESS_CONFIG +- RDMA/core: Sanitize WQ state received from the userspace +- net/sched: act_vlan: Fix modify to allow 0 +- xfrm: remove the fragment check for ipv6 beet mode +- clk: tegra30: Use 300MHz for video decoder by default +- ehea: fix error return code in ehea_restart_qps() +- RDMA/rtrs-clt: Fix memory leak of not-freed sess->stats and stats->pcpu_stats +- RDMA/rtrs-clt: Check if the queue_depth has changed during a reconnection +- RDMA/rtrs-srv: Fix memory leak when having multiple sessions +- RDMA/rtrs-srv: Fix memory leak of unfreed rtrs_srv_stats object +- RDMA/rtrs: Do not reset hb_missed_max after re-connection +- RDMA/rtrs-clt: Check state of the rtrs_clt_sess before reading its stats +- RDMA/srp: Fix a recently introduced memory leak +- mptcp: generate subflow hmac after mptcp_finish_join() +- mptcp: fix pr_debug in mptcp_token_new_connect +- drm/rockchip: cdn-dp: fix sign extension on an int multiply for a u64 result +- drm/rockchip: lvds: Fix an error handling path +- drm/rockchip: dsi: move all lane config except LCDC mux to bind() +- drm/rockchip: cdn-dp-core: add missing clk_disable_unprepare() on error in cdn_dp_grf_write() +- drm: rockchip: set alpha_en to 0 if it is not used +- net: ftgmac100: add missing error return code in ftgmac100_probe() +- clk: meson: g12a: fix gp0 and hifi ranges +- net: qrtr: ns: Fix error return code in qrtr_ns_init() +- drm/vmwgfx: Fix cpu updates of coherent multisample surfaces +- drm/vmwgfx: Mark a surface gpu-dirty after the SVGA3dCmdDXGenMips command +- pinctrl: renesas: r8a77990: JTAG pins do not have pull-down capabilities +- pinctrl: renesas: r8a7796: Add missing bias for PRESET# pin +- net: pch_gbe: Propagate error from devm_gpio_request_one() +- net: mvpp2: Put fwnode in error case during ->probe() +- video: fbdev: imxfb: Fix an error message +- drm/ast: Fix missing conversions to managed API +- drm/amd/dc: Fix a missing check bug in dm_dp_mst_detect() +- drm/bridge: Fix the stop condition of drm_bridge_chain_pre_enable() +- drm/bridge/sii8620: fix dependency on extcon +- xfrm: xfrm_state_mtu should return at least 1280 for ipv6 +- mm: memcg/slab: properly set up gfp flags for objcg pointer array +- mm/shmem: fix shmem_swapin() race with swapoff +- swap: fix do_swap_page() race with swapoff +- mm/debug_vm_pgtable: ensure THP availability via has_transparent_hugepage() +- mm/debug_vm_pgtable/basic: iterate over entire protection_map[] +- mm/debug_vm_pgtable/basic: add validation for dirtiness after write protect +- dax: fix ENOMEM handling in grab_mapping_entry() +- ocfs2: fix snprintf() checking +- blk-mq: update hctx->dispatch_busy in case of real scheduler +- cpufreq: Make cpufreq_online() call driver->offline() on errors +- ACPI: bgrt: Fix CFI violation +- ACPI: Use DEVICE_ATTR_ macros +- extcon: extcon-max8997: Fix IRQ freeing at error path +- clocksource/drivers/timer-ti-dm: Save and restore timer TIOCP_CFG +- mark pstore-blk as broken +- ACPI: sysfs: Fix a buffer overrun problem with description_show() +- nvme-pci: look for StorageD3Enable on companion ACPI device instead +- block: avoid double io accounting for flush request +- ACPI: PM / fan: Put fan device IDs into separate header file +- PM / devfreq: Add missing error code in devfreq_add_device() +- media: video-mux: Skip dangling endpoints +- media: v4l2-async: Clean v4l2_async_notifier_add_fwnode_remote_subdev +- psi: Fix race between psi_trigger_create/destroy +- crypto: nx - Fix RCU warning in nx842_OF_upd_status +- spi: spi-sun6i: Fix chipselect/clock bug +- lockdep/selftests: Fix selftests vs PROVE_RAW_LOCK_NESTING +- lockdep: Fix wait-type for empty stack +- sched/uclamp: Fix uclamp_tg_restrict() +- sched/rt: Fix Deadline utilization tracking during policy change +- sched/rt: Fix RT utilization tracking during policy change +- x86/sev: Split up runtime #VC handler for correct state tracking +- x86/sev: Make sure IRQs are disabled while GHCB is active +- btrfs: clear log tree recovering status if starting transaction fails +- regulator: hi655x: Fix pass wrong pointer to config.driver_data +- KVM: arm64: Don't zero the cycle count register when PMCR_EL0.P is set +- perf/arm-cmn: Fix invalid pointer when access dtc object sharing the same IRQ number +- KVM: x86/mmu: Fix return value in tdp_mmu_map_handle_target_level() +- KVM: nVMX: Don't clobber nested MMU's A/D status on EPTP switch +- KVM: nVMX: Ensure 64-bit shift when checking VMFUNC bitmap +- KVM: nVMX: Sync all PGDs on nested transition with shadow paging +- hwmon: (max31790) Fix fan speed reporting for fan7..12 +- hwmon: (max31722) Remove non-standard ACPI device IDs +- hwmon: (lm70) Revert "hwmon: (lm70) Add support for ACPI" +- hwmon: (lm70) Use device_get_match_data() +- media: s5p-g2d: Fix a memory leak on ctx->fh.m2m_ctx +- media: subdev: remove VIDIOC_DQEVENT_TIME32 handling +- arm64/mm: Fix ttbr0 values stored in struct thread_info for software-pan +- arm64: consistently use reserved_pg_dir +- mmc: usdhi6rol0: fix error return code in usdhi6_probe() +- crypto: sm2 - fix a memory leak in sm2 +- crypto: sm2 - remove unnecessary reset operations +- crypto: x86/curve25519 - fix cpu feature checking logic in mod_exit +- crypto: omap-sham - Fix PM reference leak in omap sham ops +- crypto: nitrox - fix unchecked variable in nitrox_register_interrupts +- regulator: fan53880: Fix vsel_mask setting for FAN53880_BUCK +- media: siano: Fix out-of-bounds warnings in smscore_load_firmware_family2() +- m68k: atari: Fix ATARI_KBD_CORE kconfig unmet dependency warning +- media: gspca/gl860: fix zero-length control requests +- media: tc358743: Fix error return code in tc358743_probe_of() +- media: au0828: fix a NULL vs IS_ERR() check +- media: exynos4-is: Fix a use after free in isp_video_release +- media: rkvdec: Fix .buf_prepare +- locking/lockdep: Reduce LOCKDEP dependency list +- pata_ep93xx: fix deferred probing +- media: rc: i2c: Fix an error message +- crypto: ccp - Fix a resource leak in an error handling path +- crypto: sa2ul - Fix pm_runtime enable in sa_ul_probe() +- crypto: sa2ul - Fix leaks on failure paths with sa_dma_init() +- x86/elf: Use _BITUL() macro in UAPI headers +- evm: fix writing /evm overflow +- pata_octeon_cf: avoid WARN_ON() in ata_host_activate() +- kbuild: Fix objtool dependency for 'OBJECT_FILES_NON_STANDARD_ := n' +- sched/uclamp: Fix locking around cpu_util_update_eff() +- sched/uclamp: Fix wrong implementation of cpu.uclamp.min +- media: I2C: change 'RST' to "RSET" to fix multiple build errors +- pata_rb532_cf: fix deferred probing +- sata_highbank: fix deferred probing +- crypto: ux500 - Fix error return code in hash_hw_final() +- crypto: ixp4xx - update IV after requests +- crypto: ixp4xx - dma_unmap the correct address +- media: hantro: do a PM resume earlier +- media: s5p_cec: decrement usage count if disabled +- media: venus: Rework error fail recover logic +- spi: Avoid undefined behaviour when counting unused native CSs +- spi: Allow to have all native CSs in use along with GPIOs +- writeback, cgroup: increment isw_nr_in_flight before grabbing an inode +- ia64: mca_drv: fix incorrect array size calculation +- kthread_worker: fix return value when kthread_mod_delayed_work() races with kthread_cancel_delayed_work_sync() +- block: fix discard request merge +- mailbox: qcom: Use PLATFORM_DEVID_AUTO to register platform device +- cifs: fix missing spinlock around update to ses->status +- HID: wacom: Correct base usage for capacitive ExpressKey status bits +- ACPI: tables: Add custom DSDT file as makefile prerequisite +- tpm_tis_spi: add missing SPI device ID entries +- clocksource: Check per-CPU clock synchronization when marked unstable +- clocksource: Retry clock read if long delays detected +- ACPI: EC: trust DSDT GPE for certain HP laptop +- cifs: improve fallocate emulation +- PCI: hv: Add check for hyperv_initialized in init_hv_pci_drv() +- EDAC/Intel: Do not load EDAC driver when running as a guest +- nvmet-fc: do not check for invalid target port in nvmet_fc_handle_fcp_rqst() +- nvme-pci: fix var. type for increasing cq_head +- platform/x86: toshiba_acpi: Fix missing error code in toshiba_acpi_setup_keyboard() +- platform/x86: asus-nb-wmi: Revert "add support for ASUS ROG Zephyrus G14 and G15" +- platform/x86: asus-nb-wmi: Revert "Drop duplicate DMI quirk structures" +- block: fix race between adding/removing rq qos and normal IO +- ACPI: resources: Add checks for ACPI IRQ override +- ACPI: bus: Call kobject_put() in acpi_init() error path +- ACPICA: Fix memory leak caused by _CID repair function +- fs: dlm: fix memory leak when fenced +- drivers: hv: Fix missing error code in vmbus_connect() +- open: don't silently ignore unknown O-flags in openat2() +- random32: Fix implicit truncation warning in prandom_seed_state() +- fs: dlm: cancel work sync othercon +- blk-mq: clear stale request in tags->rq[] before freeing one request pool +- blk-mq: grab rq->refcount before calling ->fn in blk_mq_tagset_busy_iter +- ACPI: EC: Make more Asus laptops use ECDT _GPE +- platform/x86: touchscreen_dmi: Add info for the Goodix GT912 panel of TM800A550L tablets +- platform/x86: touchscreen_dmi: Add an extra entry for the upside down Goodix touchscreen on Teclast X89 tablets +- Input: goodix - platform/x86: touchscreen_dmi - Move upside down quirks to touchscreen_dmi.c +- lib: vsprintf: Fix handling of number field widths in vsscanf +- hv_utils: Fix passing zero to 'PTR_ERR' warning +- ACPI: processor idle: Fix up C-state latency if not ordered +- EDAC/ti: Add missing MODULE_DEVICE_TABLE +- HID: do not use down_interruptible() when unbinding devices +- ACPI: video: use native backlight for GA401/GA502/GA503 +- media: Fix Media Controller API config checks +- regulator: da9052: Ensure enough delay time for .set_voltage_time_sel +- regulator: mt6358: Fix vdram2 .vsel_mask +- KVM: s390: get rid of register asm usage +- lockding/lockdep: Avoid to find wrong lock dep path in check_irq_usage() +- locking/lockdep: Fix the dep path printing for backwards BFS +- btrfs: disable build on platforms having page size 256K +- btrfs: don't clear page extent mapped if we're not invalidating the full page +- btrfs: sysfs: fix format string for some discard stats +- btrfs: abort transaction if we fail to update the delayed inode +- btrfs: fix error handling in __btrfs_update_delayed_inode +- KVM: PPC: Book3S HV: Fix TLB management on SMT8 POWER9 and POWER10 processors +- drivers/perf: fix the missed ida_simple_remove() in ddr_perf_probe() +- hwmon: (max31790) Fix pwmX_enable attributes +- hwmon: (max31790) Report correct current pwm duty cycles +- media: imx-csi: Skip first few frames from a BT.656 source +- media: siano: fix device register error path +- media: dvb_net: avoid speculation from net slot +- crypto: shash - avoid comparing pointers to exported functions under CFI +- spi: meson-spicc: fix memory leak in meson_spicc_probe +- spi: meson-spicc: fix a wrong goto jump for avoiding memory leak. +- mmc: via-sdmmc: add a check against NULL pointer dereference +- mmc: sdhci-sprd: use sdhci_sprd_writew +- memstick: rtsx_usb_ms: fix UAF +- media: dvd_usb: memory leak in cinergyt2_fe_attach +- Makefile: fix GDB warning with CONFIG_RELR +- media: st-hva: Fix potential NULL pointer dereferences +- media: bt8xx: Fix a missing check bug in bt878_probe +- media: v4l2-core: Avoid the dangling pointer in v4l2_fh_release +- media: cedrus: Fix .buf_prepare +- media: hantro: Fix .buf_prepare +- media: em28xx: Fix possible memory leak of em28xx struct +- media: bt878: do not schedule tasklet when it is not setup +- media: i2c: ov2659: Use clk_{prepare_enable,disable_unprepare}() to set xvclk on/off +- sched/fair: Fix ascii art by relpacing tabs +- arm64: perf: Convert snprintf to sysfs_emit +- crypto: qce: skcipher: Fix incorrect sg count for dma transfers +- crypto: qat - remove unused macro in FW loader +- crypto: qat - check return code of qat_hal_rd_rel_reg() +- media: imx: imx7_mipi_csis: Fix logging of only error event counters +- media: pvrusb2: fix warning in pvr2_i2c_core_done +- media: hevc: Fix dependent slice segment flags +- media: cobalt: fix race condition in setting HPD +- media: cpia2: fix memory leak in cpia2_usb_probe +- media: sti: fix obj-$(config) targets +- crypto: nx - add missing MODULE_DEVICE_TABLE +- hwrng: exynos - Fix runtime PM imbalance on error +- sched/core: Initialize the idle task with preemption disabled +- regulator: uniphier: Add missing MODULE_DEVICE_TABLE +- spi: omap-100k: Fix the length judgment problem +- spi: spi-topcliff-pch: Fix potential double free in pch_spi_process_messages() +- spi: spi-loopback-test: Fix 'tx_buf' might be 'rx_buf' +- media: exynos-gsc: fix pm_runtime_get_sync() usage count +- media: exynos4-is: fix pm_runtime_get_sync() usage count +- media: sti/bdisp: fix pm_runtime_get_sync() usage count +- media: sunxi: fix pm_runtime_get_sync() usage count +- media: s5p-jpeg: fix pm_runtime_get_sync() usage count +- media: mtk-vcodec: fix PM runtime get logic +- media: sh_vou: fix pm_runtime_get_sync() usage count +- media: am437x: fix pm_runtime_get_sync() usage count +- media: s5p: fix pm_runtime_get_sync() usage count +- media: mdk-mdp: fix pm_runtime_get_sync() usage count +- media: marvel-ccic: fix some issues when getting pm_runtime +- staging: media: rkvdec: fix pm_runtime_get_sync() usage count +- Add a reference to ucounts for each cred +- spi: Make of_register_spi_device also set the fwnode +- thermal/cpufreq_cooling: Update offline CPUs per-cpu thermal_pressure +- fuse: reject internal errno +- fuse: check connected before queueing on fpq->io +- fuse: ignore PG_workingset after stealing +- fuse: Fix infinite loop in sget_fc() +- fuse: Fix crash if superblock of submount gets killed early +- fuse: Fix crash in fuse_dentry_automount() error path +- evm: Refuse EVM_ALLOW_METADATA_WRITES only if an HMAC key is loaded +- loop: Fix missing discard support when using LOOP_CONFIGURE +- powerpc/stacktrace: Fix spurious "stale" traces in raise_backtrace_ipi() +- seq_buf: Make trace_seq_putmem_hex() support data longer than 8 +- tracepoint: Add tracepoint_probe_register_may_exist() for BPF tracing +- tracing/histograms: Fix parsing of "sym-offset" modifier +- rsi: fix AP mode with WPA failure due to encrypted EAPOL +- rsi: Assign beacon rate settings to the correct rate_info descriptor field +- ssb: sdio: Don't overwrite const buffer if block_write fails +- ath9k: Fix kernel NULL pointer dereference during ath_reset_internal() +- serial_cs: remove wrong GLOBETROTTER.cis entry +- serial_cs: Add Option International GSM-Ready 56K/ISDN modem +- serial: sh-sci: Stop dmaengine transfer in sci_stop_tx() +- serial: mvebu-uart: fix calculation of clock divisor +- iio: accel: bma180: Fix BMA25x bandwidth register values +- iio: ltr501: ltr501_read_ps(): add missing endianness conversion +- iio: ltr501: ltr559: fix initialization of LTR501_ALS_CONTR +- iio: ltr501: mark register holding upper 8 bits of ALS_DATA{0,1} and PS_DATA as volatile, too +- iio: light: tcs3472: do not free unallocated IRQ +- iio: frequency: adf4350: disable reg and clk on error in adf4350_probe() +- rtc: stm32: Fix unbalanced clk_disable_unprepare() on probe error path +- clk: agilex/stratix10: fix bypass representation +- clk: agilex/stratix10: remove noc_clk +- clk: agilex/stratix10/n5x: fix how the bypass_reg is handled +- f2fs: Prevent swap file in LFS mode +- s390: mm: Fix secure storage access exception handling +- s390/cio: dont call css_wait_for_slow_path() inside a lock +- KVM: x86/mmu: Use MMU's role to detect CR4.SMEP value in nested NPT walk +- KVM: x86/mmu: Treat NX as used (not reserved) for all !TDP shadow MMUs +- KVM: PPC: Book3S HV: Workaround high stack usage with clang +- KVM: nVMX: Handle split-lock #AC exceptions that happen in L2 +- mm/gup: fix try_grab_compound_head() race with split_huge_page() +- bus: mhi: Wait for M2 state during system resume +- mac80211: remove iwlwifi specific workaround that broke sta NDP tx +- can: peak_pciefd: pucan_handle_status(): fix a potential starvation issue in TX path +- can: j1939: j1939_sk_init(): set SOCK_RCU_FREE to call sk_destruct() after RCU is done +- can: isotp: isotp_release(): omit unintended hrtimer restart on socket release +- can: gw: synchronize rcu operations before removing gw job entry +- can: bcm: delay release of struct bcm_op after synchronize_rcu() +- ext4: use ext4_grp_locked_error in mb_find_extent +- ext4: fix avefreec in find_group_orlov +- ext4: remove check for zero nr_to_scan in ext4_es_scan() +- ext4: correct the cache_nr in tracepoint ext4_es_shrink_exit +- ext4: return error code when ext4_fill_flex_info() fails +- ext4: fix overflow in ext4_iomap_alloc() +- ext4: fix kernel infoleak via ext4_extent_header +- btrfs: clear defrag status of a root if starting transaction fails +- btrfs: compression: don't try to compress if we don't have enough pages +- btrfs: send: fix invalid path for unlink operations after parent orphanization +- ARM: dts: at91: sama5d4: fix pinctrl muxing +- ARM: dts: ux500: Fix LED probing +- crypto: ccp - Annotate SEV Firmware file names +- crypto: nx - Fix memcpy() over-reading in nonce +- Input: joydev - prevent use of not validated data in JSIOCSBTNMAP ioctl +- iov_iter_fault_in_readable() should do nothing in xarray case +- copy_page_to_iter(): fix ITER_DISCARD case +- selftests/lkdtm: Avoid needing explicit sub-shell +- ntfs: fix validity check for file name attribute +- gfs2: Fix error handling in init_statfs +- gfs2: Fix underflow in gfs2_page_mkwrite +- xhci: solve a double free problem while doing s4 +- usb: typec: Add the missed altmode_id_remove() in typec_register_altmode() +- usb: dwc3: Fix debugfs creation flow +- USB: cdc-acm: blacklist Heimann USB Appset device +- usb: renesas-xhci: Fix handling of unknown ROM state +- usb: gadget: eem: fix echo command packet response issue +- net: can: ems_usb: fix use-after-free in ems_usb_disconnect() +- Input: usbtouchscreen - fix control-request directions +- media: dvb-usb: fix wrong definition +- ALSA: hda/realtek: fix mute/micmute LEDs for HP EliteBook 830 G8 Notebook PC +- ALSA: hda/realtek: Apply LED fixup for HP Dragonfly G1, too +- ALSA: hda/realtek: Fix bass speaker DAC mapping for Asus UM431D +- ALSA: hda/realtek: Improve fixup for HP Spectre x360 15-df0xxx +- ALSA: hda/realtek: fix mute/micmute LEDs for HP EliteBook x360 830 G8 +- ALSA: hda/realtek: Add another ALC236 variant support +- ALSA: hda/realtek: fix mute/micmute LEDs for HP ProBook 630 G8 +- ALSA: hda/realtek: fix mute/micmute LEDs for HP ProBook 445 G8 +- ALSA: hda/realtek: fix mute/micmute LEDs for HP ProBook 450 G8 +- ALSA: intel8x0: Fix breakage at ac97 clock measurement +- ALSA: usb-audio: scarlett2: Fix wrong resume call +- ALSA: firewire-motu: fix stream format for MOTU 8pre FireWire +- ALSA: usb-audio: Fix OOB access at proc output +- ALSA: usb-audio: fix rate on Ozone Z90 USB headset +- Bluetooth: Remove spurious error message +- Bluetooth: btqca: Don't modify firmware contents in-place +- Bluetooth: hci_qca: fix potential GPF +- Revert "evm: Refuse EVM_ALLOW_METADATA_WRITES only if an HMAC key is loaded" +- configfs: fix memleak in configfs_release_bin_file +- init: only move down lockup_detector_init() when sdei_watchdog is enabled +- arm64: fix AUDIT_ARCH_AARCH64ILP32 bug on audit subsystem +- ext4: cleanup in-core orphan list if ext4_truncate() failed to get a transaction handle +- ext4: fix WARN_ON_ONCE(!buffer_uptodate) after an error writing the superblock +- tty/serial/imx: Enable TXEN bit in imx_poll_init(). +- xen/events: reset active flag for lateeoi events later +- Hexagon: change jumps to must-extend in futex_atomic_* +- Hexagon: add target builtins to kernel +- Hexagon: fix build errors +- media: uvcvideo: Support devices that report an OT as an entity source +- KVM: PPC: Book3S HV: Save and restore FSCR in the P9 path +- ubifs: Remove ui_mutex in ubifs_xattr_get and change_xattr +- ubifs: Fix races between xattr_{set|get} and listxattr operations +- block: stop wait rcu once we can ensure no io while elevator init +- writeback: don't warn on an unregistered BDI in __mark_inode_dirty +- mm/page_isolation: do not isolate the max order page +- mm/zswap: fix passing zero to 'PTR_ERR' warning +- mm/page_alloc: speed up the iteration of max_order +- mm: hugetlb: fix type of delta parameter and related local variables in gather_surplus_pages() +- mm: vmalloc: prevent use after free in _vm_unmap_aliases +- arm32: kaslr: Fix the bitmap error +- net: make sure devices go through netdev_wait_all_refs +- net: fib_notifier: don't return positive values on fib registration +- netfilter: nftables: avoid potential overflows on 32bit arches +- netfilter: Dissect flow after packet mangling +- net: fix a concurrency bug in l2tp_tunnel_register() +- ext4: fix possible UAF when remounting r/o a mmp-protected file system +- SUNRPC: Should wake up the privileged task firstly. +- SUNRPC: Fix the batch tasks count wraparound. +- Revert "KVM: x86/mmu: Drop kvm_mmu_extended_role.cr4_la57 hack" +- RDMA/mlx5: Block FDB rules when not in switchdev mode +- gpio: AMD8111 and TQMX86 require HAS_IOPORT_MAP +- drm/nouveau: fix dma_address check for CPU/GPU sync +- gpio: mxc: Fix disabled interrupt wake-up support +- scsi: sr: Return appropriate error code when disk is ejected +- arm64: seccomp: fix compilation error with ILP32 support +- scsi: sd: block: Fix regressions in read-only block device handling +- integrity: Load mokx variables into the blacklist keyring +- certs: Add ability to preload revocation certs +- certs: Move load_system_certificate_list to a common function +- certs: Add EFI_CERT_X509_GUID support for dbx entries +- Revert "drm: add a locked version of drm_is_current_master" +- netfs: fix test for whether we can skip read when writing beyond EOF +- swiotlb: manipulate orig_addr when tlb_addr has offset +- KVM: SVM: Call SEV Guest Decommission if ASID binding fails +- mm, futex: fix shared futex pgoff on shmem huge page +- mm/thp: another PVMW_SYNC fix in page_vma_mapped_walk() +- mm/thp: fix page_vma_mapped_walk() if THP mapped by ptes +- mm: page_vma_mapped_walk(): get vma_address_end() earlier +- mm: page_vma_mapped_walk(): use goto instead of while (1) +- mm: page_vma_mapped_walk(): add a level of indentation +- mm: page_vma_mapped_walk(): crossing page table boundary +- mm: page_vma_mapped_walk(): prettify PVMW_MIGRATION block +- mm: page_vma_mapped_walk(): use pmde for *pvmw->pmd +- mm: page_vma_mapped_walk(): settle PageHuge on entry +- mm: page_vma_mapped_walk(): use page for pvmw->page +- mm: thp: replace DEBUG_VM BUG with VM_WARN when unmap fails for split +- mm/thp: unmap_mapping_page() to fix THP truncate_cleanup_page() +- mm/thp: fix page_address_in_vma() on file THP tails +- mm/thp: fix vma_address() if virtual address below file offset +- mm/thp: try_to_unmap() use TTU_SYNC for safe splitting +- mm/thp: make is_huge_zero_pmd() safe and quicker +- mm/thp: fix __split_huge_pmd_locked() on shmem migration entry +- mm, thp: use head page in __migration_entry_wait() +- mm/rmap: use page_not_mapped in try_to_unmap() +- mm/rmap: remove unneeded semicolon in page_not_mapped() +- mm: add VM_WARN_ON_ONCE_PAGE() macro +- x86/fpu: Make init_fpstate correct with optimized XSAVE +- x86/fpu: Preserve supervisor states in sanitize_restored_user_xstate() +- kthread: prevent deadlock when kthread_mod_delayed_work() races with kthread_cancel_delayed_work_sync() +- kthread_worker: split code for canceling the delayed work timer +- ceph: must hold snap_rwsem when filling inode for async create +- i2c: robotfuzz-osif: fix control-request directions +- KVM: do not allow mapping valid but non-reference-counted pages +- s390/stack: fix possible register corruption with stack switch helper +- nilfs2: fix memory leak in nilfs_sysfs_delete_device_group +- gpiolib: cdev: zero padding during conversion to gpioline_info_changed +- i2c: i801: Ensure that SMBHSTSTS_INUSE_STS is cleared when leaving i801_access +- pinctrl: stm32: fix the reported number of GPIO lines per bank +- perf/x86: Track pmu in per-CPU cpu_hw_events +- net: ll_temac: Avoid ndo_start_xmit returning NETDEV_TX_BUSY +- net: ll_temac: Add memory-barriers for TX BD access +- PCI: Add AMD RS690 quirk to enable 64-bit DMA +- recordmcount: Correct st_shndx handling +- mac80211: handle various extensible elements correctly +- mac80211: reset profile_periodicity/ema_ap +- net: qed: Fix memcpy() overflow of qed_dcbx_params() +- KVM: selftests: Fix kvm_check_cap() assertion +- r8169: Avoid memcpy() over-reading of ETH_SS_STATS +- sh_eth: Avoid memcpy() over-reading of ETH_SS_STATS +- r8152: Avoid memcpy() over-reading of ETH_SS_STATS +- net/packet: annotate accesses to po->ifindex +- net/packet: annotate accesses to po->bind +- net: caif: fix memory leak in ldisc_open +- riscv32: Use medany C model for modules +- net: phy: dp83867: perform soft reset and retain established link +- net/packet: annotate data race in packet_sendmsg() +- inet: annotate date races around sk->sk_txhash +- net: annotate data race in sock_error() +- ping: Check return value of function 'ping_queue_rcv_skb' +- inet: annotate data race in inet_send_prepare() and inet_dgram_connect() +- net: ethtool: clear heap allocations for ethtool function +- mac80211: drop multicast fragments +- net: ipv4: Remove unneed BUG() function +- dmaengine: mediatek: use GFP_NOWAIT instead of GFP_ATOMIC in prep_dma +- dmaengine: mediatek: do not issue a new desc if one is still current +- dmaengine: mediatek: free the proper desc in desc_free handler +- dmaengine: rcar-dmac: Fix PM reference leak in rcar_dmac_probe() +- cfg80211: call cfg80211_leave_ocb when switching away from OCB +- mac80211_hwsim: drop pending frames on stop +- mac80211: remove warning in ieee80211_get_sband() +- dmaengine: xilinx: dpdma: Limit descriptor IDs to 16 bits +- dmaengine: xilinx: dpdma: Add missing dependencies to Kconfig +- dmaengine: stm32-mdma: fix PM reference leak in stm32_mdma_alloc_chan_resourc() +- dmaengine: zynqmp_dma: Fix PM reference leak in zynqmp_dma_alloc_chan_resourc() +- perf/x86/intel/lbr: Zero the xstate buffer on allocation +- perf/x86/lbr: Remove cpuc->lbr_xsave allocation from atomic context +- locking/lockdep: Improve noinstr vs errors +- x86/xen: Fix noinstr fail in exc_xen_unknown_trap() +- x86/entry: Fix noinstr fail in __do_fast_syscall_32() +- drm/vc4: hdmi: Make sure the controller is powered in detect +- drm/vc4: hdmi: Move the HSM clock enable to runtime_pm +- Revert "PCI: PM: Do not read power state in pci_enable_device_flags()" +- spi: spi-nxp-fspi: move the register operation after the clock enable +- arm64: Ignore any DMA offsets in the max_zone_phys() calculation +- MIPS: generic: Update node names to avoid unit addresses +- mmc: meson-gx: use memcpy_to/fromio for dram-access-quirk +- ARM: 9081/1: fix gcc-10 thumb2-kernel regression +- drm/amdgpu: wait for moving fence after pinning +- drm/radeon: wait for moving fence after pinning +- drm/nouveau: wait for moving fence after pinning v2 +- drm: add a locked version of drm_is_current_master +- Revert "drm/amdgpu/gfx10: enlarge CP_MEC_DOORBELL_RANGE_UPPER to cover full doorbell." +- Revert "drm/amdgpu/gfx9: fix the doorbell missing when in CGPG issue." +- module: limit enabling module.sig_enforce + +* Wed Oct 13 2021 Zheng Zengkai - 5.10.0-9.0.0.3 +- scsi: core: Treat device offline as a failure +- blk-wbt: make sure throttle is enabled properly +- blk-wbt: introduce a new disable state to prevent false positive by rwb_enabled() +- arm64: fpsimd: run kernel mode NEON with softirqs disabled +- arm64: assembler: introduce wxN aliases for wN registers +- arm64: assembler: remove conditional NEON yield macros +- crypto: arm64/crc-t10dif - move NEON yield to C code +- crypto: arm64/aes-ce-mac - simplify NEON yield +- crypto: arm64/aes-neonbs - remove NEON yield calls +- crypto: arm64/sha512-ce - simplify NEON yield +- crypto: arm64/sha3-ce - simplify NEON yield +- crypto: arm64/sha2-ce - simplify NEON yield +- crypto: arm64/sha1-ce - simplify NEON yield +- arm64: assembler: add cond_yield macro +- mm: fix page reference leak in soft_offline_page() +- block_dump: remove comments in docs +- block_dump: remove block_dump feature +- block_dump: remove block_dump feature in mark_inode_dirty() +- crypto: sun8i-ce - fix error return code in sun8i_ce_prng_generate() +- crypto: nx - add missing call to of_node_put() +- net: hns3: fix a return value error in hclge_get_reset_status() +- net: hns3: check vlan id before using it +- net: hns3: check queue id range before using +- net: hns3: fix misuse vf id and vport id in some logs +- net: hns3: fix inconsistent vf id print +- net: hns3: fix change RSS 'hfunc' ineffective issue +- net: hns3: fix the timing issue of VF clearing interrupt sources +- net: hns3: fix the exception when query imp info +- net: hns3: disable mac in flr process +- net: hns3: change affinity_mask to numa node range +- net: hns3: pad the short tunnel frame before sending to hardware +- net: hns3: make hclgevf_cmd_caps_bit_map0 and hclge_cmd_caps_bit_map0 static + +* Mon Oct 11 2021 Zheng Zengkai - 5.10.0-8.0.0.2 +- imans: Use initial ima namespace domain tag when IMANS is disabled. + +* Thu Sep 30 2021 Zheng Zengkai - 5.10.0-7.0.0.1 +- IOMMU: SMMUv2: Bypass SMMU in default for some SoCs +- arm64: phytium: using MIDR_PHYTIUM_FT2000PLUS instead of ARM_CPU_IMP_PHYTIUM +- arm64: Add MIDR encoding for PHYTIUM CPUs +- arm64: Add MIDR encoding for HiSilicon Taishan CPUs +- usb: xhci: Add workaround for phytium +- arm64: topology: Support PHYTIUM CPU +- hugetlb: pass head page to remove_hugetlb_page() +- userfaultfd: hugetlbfs: fix new flag usage in error path +- hugetlb: fix uninitialized subpool pointer +- percpu: flush tlb in pcpu_reclaim_populated() +- percpu: implement partial chunk depopulation +- percpu: use pcpu_free_slot instead of pcpu_nr_slots - 1 +- percpu: factor out pcpu_check_block_hint() +- percpu: split __pcpu_balance_workfn() +- percpu: fix a comment about the chunks ordering +- slub: fix kmalloc_pagealloc_invalid_free unit test +- slub: fix unreclaimable slab stat for bulk free +- net: hns3: remove unnecessary spaces +- net: hns3: add some required spaces +- net: hns3: clean up a type mismatch warning +- net: hns3: refine function hns3_set_default_feature() +- net: hns3: uniform parameter name of hclge_ptp_clean_tx_hwts() +- net: hnss3: use max() to simplify code +- net: hns3: modify a print format of hns3_dbg_queue_map() +- net: hns3: refine function hclge_dbg_dump_tm_pri() +- net: hns3: reconstruct function hclge_ets_validate() +- net: hns3: reconstruct function hns3_self_test +- net: hns3: initialize each member of structure array on a separate line +- net: hns3: add required space in comment +- net: hns3: remove unnecessary "static" of local variables in function +- net: hns3: don't config TM DWRR twice when set ETS +- net: hns3: add new function hclge_get_speed_bit() +- net: hns3: refactor function hclgevf_parse_capability() +- net: hns3: refactor function hclge_parse_capability() +- net: hns3: add trace event in hclge_gen_resp_to_vf() +- net: hns3: uniform type of function parameter cmd +- net: hns3: merge some repetitive macros +- net: hns3: package new functions to simplify hclgevf_mbx_handler code +- net: hns3: remove redundant param to simplify code +- net: hns3: use memcpy to simplify code +- net: hns3: remove redundant param mbx_event_pending +- net: hns3: add hns3_state_init() to do state initialization +- net: hns3: add macros for mac speeds of firmware command +- sched: bugfix setscheduler unlock cpuset_rwsem +- ima: fix db size overflow and Kconfig issues +- mm: page_poison: print page info when corruption is caught +- kasan: fix conflict with page poisoning +- mm: fix page_owner initializing issue for arm32 +- net: hns3: add ethtool support for CQE/EQE mode configuration +- net: hns3: add support for EQE/CQE mode configuration +- ethtool: extend coalesce setting uAPI with CQE mode +- ethtool: add two coalesce attributes for CQE mode +- ethtool: add ETHTOOL_COALESCE_ALL_PARAMS define +- net: hns3: fix get wrong pfc_en when query PFC configuration +- net: hns3: fix GRO configuration error after reset +- net: hns3: change the method of getting cmd index in debugfs +- net: hns3: fix duplicate node in VLAN list +- net: hns3: fix speed unknown issue in bond 4 +- net: hns3: add waiting time before cmdq memory is released +- net: hns3: clear hardware resource when loading driver +- net: hns3: make array spec_opcode static const, makes object smaller +- digest list: disable digest lists in non-root ima namespaces +- ima: Introduce ima-ns-sig template +- ima: fix a potential crash owing to the compiler optimisation +- ima: Set ML template per ima namespace +- ima: Add dummy boot aggregate to per ima namespace measurement list +- ima: Load per ima namespace x509 certificate +- integrity: Add key domain tag to the search criteria +- ima: Add key domain to the ima namespace +- keys: Allow to set key domain tag separately from the key type +- keys: Include key domain tag in the iterative search +- keys: Add domain tag to the keyring search criteria +- ima: Remap IDs of subject based rules if necessary +- user namespace: Add function that checks if the UID map is defined +- ima: Parse per ima namespace policy file +- ima: Configure the new ima namespace from securityfs +- ima: Change the owning user namespace of the ima namespace if necessary +- ima: Add the violation counter to the namespace +- ima: Extend permissions to the ima securityfs entries +- ima: Add a reader counter to the integrity inode data +- ima: Add per namespace view of the measurement list +- ima: Add a new ima template that includes namespace ID +- ima: Check ima namespace ID during digest entry lookup +- ima: Keep track of the measurment list per ima namespace +- ima: Add ima namespace id to the measurement list related structures +- ima: Enable per ima namespace policy settings +- ima: Add integrity inode related data to the ima namespace +- ima: Extend the APIs in the integrity subsystem +- ima: Add ima namespace to the ima subsystem APIs +- ima: Add methods for parsing ima policy configuration string +- ima: Add ima policy related data to the ima namespace +- ima: Bind ima namespace to the file descriptor +- ima: Add a list of the installed ima namespaces +- ima: Introduce ima namespace +- mm/page_alloc: further fix __alloc_pages_bulk() return value +- mm/page_alloc: correct return value when failing at preparing +- mm/page_alloc: avoid page allocator recursion with pagesets.lock held +- mm: vmscan: shrink deferred objects proportional to priority +- mm: memcontrol: reparent nr_deferred when memcg offline +- mm: vmscan: don't need allocate shrinker->nr_deferred for memcg aware shrinkers +- mm: vmscan: use per memcg nr_deferred of shrinker +- mm: vmscan: add per memcg shrinker nr_deferred +- mm: vmscan: use a new flag to indicate shrinker is registered +- mm: vmscan: add shrinker_info_protected() helper +- mm: memcontrol: rename shrinker_map to shrinker_info +- mm: vmscan: use kvfree_rcu instead of call_rcu +- mm: vmscan: remove memcg_shrinker_map_size +- mm: vmscan: use shrinker_rwsem to protect shrinker_maps allocation +- mm: vmscan: consolidate shrinker_maps handling code +- mm: vmscan: use nid from shrink_control for tracepoint +- scsi/hifc: Fix memory leakage bug +- crypto: hisilicon/qm - set a qp error flag for userspace +- vfio/hisilicon: add acc live migration driver +- vfio/hisilicon: modify QM for live migration driver +- vfio/pci: provide customized live migration VFIO driver framework +- PCI: Set dma-can-stall for HiSilicon chips +- PCI: Add a quirk to set pasid_no_tlp for HiSilicon chips +- PCI: PASID can be enabled without TLP prefix +- crypto: hisilicon/sec - fix the CTR mode BD configuration +- crypto: hisilicon/sec - fix the max length of AAD for the CCM mode +- crypto: hisilicon/sec - fixup icv checking enabled on Kunpeng 930 +- crypto: hisilicon - check _PS0 and _PR0 method +- crypto: hisilicon - change parameter passing of debugfs function +- crypto: hisilicon - support runtime PM for accelerator device +- crypto: hisilicon - add runtime PM ops +- crypto: hisilicon - using 'debugfs_create_file' instead of 'debugfs_create_regset32' +- crypto: hisilicon/sec - modify the hardware endian configuration +- crypto: hisilicon/sec - fix the abnormal exiting process +- crypto: hisilicon - enable hpre device clock gating +- crypto: hisilicon - enable sec device clock gating +- crypto: hisilicon - enable zip device clock gating +- crypto: hisilicon/sec - fix the process of disabling sva prefetching + +* Wed Sep 15 2021 Zheng Zengkai - 5.10.0-6.0.0.0 +- mm/page_alloc: correct return value of populated elements if bulk array is populated +- mm: fix oom killing for disabled pid +- X86/config: Enable CONFIG_USERSWAP +- eulerfs: change default config file +- eulerfs: add Kconfig and Makefile +- eulerfs: add super_operations and module_init/exit +- eulerfs: add inode_operations for symlink inode +- eulerfs: add file_operations for dir inode +- eulerfs: add inode_operations for dir inode and special inode +- eulerfs: add file operations and inode operations for regular file +- eulerfs: add dax operations +- eulerfs: add inode related interfaces +- eulerfs: add dependency operations +- eulerfs: add nv dict operations +- eulerfs: add filename interfaces +- eulerfs: add interfaces for page wear +- eulerfs: add interfaces for inode lock transfer +- eulerfs: add flush interfaces +- eulerfs: add memory allocation interfaces +- eulerfs: add kmeme_cache definitions and interfaces +- eulerfs: common definitions +- vfio/pci: Fix wrong return value when get iommu attribute DOMAIN_ATTR_NESTING +- net: hns3: remove always exist devlink pointer check +- net: hns3: add support ethtool extended link state +- net: hns3: add header file hns3_ethtoo.h +- ethtool: add two link extended substates of bad signal integrity +- docs: ethtool: Add two link extended substates of bad signal integrity +- net: hns3: add support for triggering reset by ethtool + +* Mon Aug 23 2021 ShiYuan HU - 5.10.0-5.3.0.19 +- check-kabi: check-kabi support python3 and python2 + +* Fri Aug 13 2021 Zheng Zengkai - 5.10.0-5.3.0.18 +- srcu: Take early exit on memory-allocation failure +- iommu: fix build error when CONFIG_IOMMU_API is off +- USB: Fix some clerical mistakes + +* Mon Aug 9 2021 Zheng Zengkai - 5.10.0-5.2.0.17 +- userswap: add a kernel parameter to enable userswap +- userfaultfd: fix BUG_ON() in userfaultfd_release() +- spi: hisi-kunpeng: Fix Woverflow warning on conversion +- spi: Add HiSilicon SPI Controller Driver for Kunpeng SoCs +- scsi: hisi_sas: Speed up error handling when internal abort timeout occurs +- scsi: hisi_sas: Reset controller for internal abort timeout +- scsi: hisi_sas: Include HZ in timer macros +- scsi: hisi_sas: Run I_T nexus resets in parallel for clear nexus reset +- scsi: hisi_sas: Put a limit of link reset retries +- scsi: libsas: Introduce more SAM status code aliases in enum exec_status +- scsi: hisi_sas: Propagate errors in interrupt_init_v1_hw() +- scsi: hisi_sas: Print SATA device SAS address for soft reset failure +- scsi: hisi_sas: Warn in v3 hw channel interrupt handler when status reg cleared +- scsi: hisi_sas: Directly snapshot registers when executing a reset +- scsi: hisi_sas: Call sas_unregister_ha() to roll back if .hw_init() fails +- scsi: hisi_sas: Print SAS address for v3 hw erroneous completion print +- scsi: hisi_sas: Delete some unused callbacks +- scsi: hisi_sas: Add trace FIFO debugfs support +- scsi: hisi_sas: Flush workqueue in hisi_sas_v3_remove() +- scsi: hisi_sas: Enable debugfs support by default +- scsi: hisi_sas: Don't check .nr_hw_queues in hisi_sas_task_prep() +- scsi: hisi_sas: Remove deferred probe check in hisi_sas_v2_probe() +- scsi: libsas: Remove temporarily-added _gfp() API variants +- scsi: mvsas: Switch back to original libsas event notifiers +- scsi: isci: Switch back to original libsas event notifiers +- scsi: libsas: Switch back to original event notifiers API +- scsi: pm80xx: Switch back to original libsas event notifiers +- scsi: aic94xx: Switch back to original libsas event notifiers +- scsi: hisi_sas: Switch back to original libsas event notifiers +- scsi: libsas: Add gfp_t flags parameter to event notifications +- scsi: hisi_sas: Pass gfp_t flags to libsas event notifiers +- scsi: aic94xx: Pass gfp_t flags to libsas event notifiers +- scsi: pm80xx: Pass gfp_t flags to libsas event notifiers +- scsi: libsas: Pass gfp_t flags to event notifiers +- scsi: hisi_sas: Remove auto_affine_msi_experimental module_param +- scsi: hisi_sas: Expose HW queues for v2 hw +- driver core: platform: Add devm_platform_get_irqs_affinity() +- ACPI: Drop acpi_dev_irqresource_disabled() +- resource: Add irqresource_disabled() +- genirq/affinity: Add irq_update_affinity_desc() +- mm: fix some spelling mistakes in comments +- scsi: hisi_sas: Remove preemptible() +- scsi: hisi_sas: Move debugfs code to v3 hw driver +- scsi: hisi_sas: Reduce some indirection in v3 hw driver +- scsi: hisi_sas_v3_hw: Remove extra function calls for runtime pm +- scsi: hisi_sas_v3_hw: Don't use PCI helper functions +- scsi: hisi_sas_v3_hw: Drop PCI Wakeup calls from .resume +- ACPI: APEI: fix synchronous external aborts in user-mode +- Revert "kretprobe: check re-registration of the same kretprobe earlier" +- i2c: add support for HiSilicon I2C controller +- i2c: core: add api to provide frequency mode strings +- i2c: core: add managed function for adding i2c adapters +- fs/buffer.c: add checking buffer head stat before clear +- watchdog: sbsa: Support architecture version 1 +- perf/smmuv3: Don't trample existing events with global filter +- arm_pmu: move to use request_irq by IRQF_NO_AUTOEN flag +- genirq: Add IRQF_NO_AUTOEN for request_irq/nmi() +- drivers/perf: hisi: Fix data source control +- perf/hisi: Use irq_set_affinity() +- perf/arm-smmuv3: Use irq_set_affinity() +- genirq: Export affinity setter for modules +- drivers/perf: hisi: Add support for HiSilicon PA PMU driver +- drivers/perf: hisi: Add support for HiSilicon SLLC PMU driver +- drivers/perf: hisi: Update DDRC PMU for programmable counter +- drivers/perf: hisi: Add new functions for HHA PMU +- drivers/perf: hisi: Add new functions for L3C PMU +- drivers/perf: hisi: Add PMU version for uncore PMU drivers. +- drivers/perf: hisi: Refactor code for more uncore PMUs +- drivers/perf: hisi: Remove unnecessary check of counter index +- driver/perf: Remove ARM_SMMU_V3_PMU dependency on ARM_SMMU_V3 +- drivers/perf: Add support for ARMv8.3-SPE +- perf/smmuv3: Support sysfs identifier file +- drivers/perf: hisi: Add identifier sysfs file +- net: hns3: change the method of obtaining default ptp cycle +- net: hns3: add devlink reload support for VF +- net: hns3: add devlink reload support for PF +- net: hns3: add support for devlink get info for VF +- net: hns3: add support for devlink get info for PF +- net: hns3: add support for registering devlink for VF +- net: hns3: add support for registering devlink for PF +- devlink: add documentation for hns3 driver +- seq_file: disallow extremely large seq buffer allocations + +* Tue Jul 27 2021 Zheng Zengkai - 5.10.0-5.1.0.16 +- config: enable kernel hotupgrade features by default +- pid: add pid reserve method for checkpoint and recover +- mm: add pin memory method for checkpoint add restore +- arm64: Add memmap parameter and register pmem +- arm64: smp: Add support for cpu park +- arm64: Reserve memory for quick kexec +- kexec: Add quick kexec support for kernel +- openeuler_defconfig: Enable CONFIG_SMMU_BYPASS_DEV by default +- iommu: Enable smmu-v3 when 3408iMR/3416iMRraid card exist +- net: hns3: fix rx VLAN offload state inconsistent issue +- net: hns3: disable port VLAN filter when support function level VLAN filter control +- net: hns3: add match_id to check mailbox response from PF to VF +- net: hns3: fix possible mismatches resp of mailbox +- iommu/arm-smmu-v3: Add support for less than one ECMDQ per core +- iommu/arm-smmu-v3: Add arm_smmu_ecmdq_issue_cmdlist() for non-shared ECMDQ +- iommu/arm-smmu-v3: Ensure that a set of associated commands are inserted in the same ECMDQ +- iommu/arm-smmu-v3: Add support for ECMDQ register mode +- iommu/arm-smmu-v3: Extract reusable function __arm_smmu_cmdq_skip_err() +- iommu/arm-smmu-v3: Add and use static helper function arm_smmu_get_cmdq() +- iommu/arm-smmu-v3: Add and use static helper function arm_smmu_cmdq_issue_cmd_with_sync() +- iommu/arm-smmu-v3: Use command queue batching helpers to improve performance +- sched: Add /debug/sched_preempt +- preempt/dynamic: Support dynamic preempt with preempt= boot option +- preempt/dynamic: Provide irqentry_exit_cond_resched() static call +- preempt/dynamic: Provide preempt_schedule[_notrace]() static calls +- preempt/dynamic: Provide cond_resched() and might_resched() static calls +- preempt: Introduce CONFIG_PREEMPT_DYNAMIC +- static_call: Provide DEFINE_STATIC_CALL_RET0() +- static_call/x86: Add __static_call_return0() +- openeuler_defconfig: Enable Phytium FT-2500 support by default +- irqchip/gic-phytium-2500: Add support for GIC of Phytium S2500 +- sched/fair: Merge select_idle_core/cpu() +- sched/fair: Remove select_idle_smt() +- sched/fair: Move avg_scan_cost calculations under SIS_PROP +- sched/fair: Remove SIS_AVG_CPU +- net: hns3: add support for dumping MAC umv counter in debugfs +- net: hns3: add support for FD counter in debugfs +- net: hns3: Fix a memory leak in an error handling path in 'hclge_handle_error_info_log()' +- net: hns3: fix different snprintf() limit +- net: hns3: fix reuse conflict of the rx page +- net: hns3: use bounce buffer when rx page can not be reused +- net: hns3: optimize the rx page reuse handling process +- net: hns3: support dma_map_sg() for multi frags skb +- net: hns3: add support to query tx spare buffer size for pf +- net: hns3: use tx bounce buffer for small packets +- net: hns3: refactor for hns3_fill_desc() function +- net: hns3: minor refactor related to desc_cb handling +- net: hns3: fix a double shift bug +- net: hns3: add debugfs support for ptp info +- net: hns3: add support for PTP +- net: hns3: use list_move_tail instead of list_del/list_add_tail in hclge_main.c +- net: hns3: use list_move_tail instead of list_del/list_add_tail in hclgevf_main.c +- net: hns3: add error handling compatibility during initialization +- net: hns3: update error recovery module and type +- net: hns3: add support for imp-handle ras capability +- net: hns3: add the RAS compatibility adaptation solution +- net: hns3: add support for handling all errors through MSI-X +- net: hns3: remove now redundant logic related to HNAE3_UNKNOWN_RESET +- net: hns3: add scheduling logic for error handling task +- net: hns3: add a separate error handling task +- net: hns3: add debugfs support for vlan configuration +- net: hns3: add support for VF modify VLAN filter state +- net: hns3: add query basic info support for VF +- net: hns3: add support for modify VLAN filter state +- net: hns3: refine function hclge_set_vf_vlan_cfg() +- net: hns3: remove unnecessary updating port based VLAN +- net: hns3: refine for hclge_push_vf_port_base_vlan_info() +- net: hns3: add 'QoS' support for port based VLAN configuration +- net: hns3: switch to dim algorithm for adaptive interrupt moderation +- net: hns3: use HCLGE_VPORT_STATE_PROMISC_CHANGE to replace HCLGE_STATE_PROMISC_CHANGED +- net: hns3: configure promisc mode for VF asynchronously +- net: hns3: Fix return of uninitialized variable ret +- net: hns3: remove the useless debugfs file node cmd +- net: hns3: refactor dump serv info of debugfs +- net: hns3: refactor dump mac tnl status of debugfs +- net: hns3: refactor dump qs shaper of debugfs +- net: hns3: refactor dump qos buf cfg of debugfs +- net: hns3: refactor dump qos pri map of debugfs +- net: hns3: refactor dump qos pause cfg of debugfs +- net: hns3: refactor dump tc of debugfs +- net: hns3: refactor dump tm of debugfs +- net: hns3: refactor dump tm map of debugfs +- net: hns3: refactor dump fd tcam of debugfs +- net: hns3: refactor queue info of debugfs +- net: hns3: refactor queue map of debugfs +- net: hns3: refactor dump reg dcb info of debugfs +- net: hns3: refactor dump reg of debugfs +- net: hns3: fix user's coalesce configuration lost issue +- net: hns3: refactor dump ncl config of debugfs +- net: hns3: refactor dump m7 info of debugfs +- net: hns3: refactor dump reset info of debugfs +- net: hns3: refactor dump intr of debugfs +- net: hns3: refactor dump loopback of debugfs +- net: hns3: refactor dump mng tbl of debugfs +- net: hns3: refactor dump mac list of debugfs +- net: hns3: refactor dump bd info of debugfs +- net: hns3: refactor dev capability and dev spec of debugfs +- net: hns3: refactor the debugfs process +- net: hns3: refactor out RX completion checksum +- net: hns3: support RXD advanced layout +- net: hns3: clear unnecessary reset request in hclge_reset_rebuild +- net: hns3: change the value of the SEPARATOR_VALUE macro in hclgevf_main.c +- net: hns3: cleanup inappropriate spaces in struct hlcgevf_tqp_stats +- net: hns3: remove a duplicate pf reset counting +- net: hns3: VF not request link status when PF support push link status feature +- net: hns3: PF add support for pushing link status to VFs +- net: hns3: Fix potential null pointer defererence of null ae_dev +- net: hns3: Trivial spell fix in hns3 driver +- net: hns3: add suspend and resume pm_ops +- net: hns3: change flr_prepare/flr_done function names +- net: hns3: Remove un-necessary 'else-if' in the hclge_reset_event() +- net: hns3: Remove the left over redundant check & assignment +- net: hns3: add stats logging when skb padding fails +- net: hns3: expand the tc config command +- net: hns3: add tx send size handling for tso skb +- net: hns3: optimize the process of queue reset +- net: hns3: remove the rss_size limitation by vector num +- net: hns3: fix use-after-free issue for hclge_add_fd_entry_common() +- net: hns3: fix missing rule state assignment +- net: hns3: no return statement in hclge_clear_arfs_rules +- net: hns3: split out hclge_tm_vport_tc_info_update() +- net: hns3: split function hclge_reset_rebuild() +- net: hns3: fix some typos in hclge_main.c +- net: hns3: fix prototype warning +- net: hns3: remove unused parameter from hclge_dbg_dump_loopback() +- net: hns3: remove unused parameter from hclge_set_vf_vlan_common() +- net: hns3: remove redundant query in hclge_config_tm_hw_err_int() +- net: hns3: remove redundant blank lines +- net: hns3: remove unused code of vmdq +- net: hns3: add support for user-def data of flow director +- net: hns3: refine for hns3_del_all_fd_entries() +- net: hns3: refactor flow director configuration +- net: hns3: add support for traffic class tuple support for flow director by ethtool +- net: hns3: refactor for function hclge_fd_convert_tuple +- net: hns3: refactor out hclge_fd_get_tuple() +- net: hns3: refactor out hclge_add_fd_entry() +- net: hns3: add phy loopback support for imp-controlled PHYs +- net: hns3: add ioctl support for imp-controlled PHYs +- net: hns3: add get/set pause parameters support for imp-controlled PHYs +- net: hns3: add support for imp-controlled PHYs +- net: hns3: use pause capability queried from firmware +- net: hns3: use FEC capability queried from firmware +- net: hns3: refactor out hclge_rm_vport_all_mac_table() +- net: hns3: refactor out hclgevf_set_rss_tuple() +- net: hns3: refactor out hclge_set_rss_tuple() +- net: hns3: split out hclgevf_cmd_send() +- net: hns3: split out hclge_cmd_send() +- net: hns3: split out hclge_dbg_dump_qos_buf_cfg() +- net: hns3: refactor out hclgevf_get_rss_tuple() +- net: hns3: refactor out hclge_get_rss_tuple() +- net: hns3: refactor out hclge_set_vf_vlan_common() +- net: hns3: use ipv6_addr_any() helper +- net: hns3: clean up hns3_dbg_cmd_write() +- net: hns3: refactor out hclgevf_cmd_convert_err_code() +- net: hns3: refactor out hclge_cmd_convert_err_code() +- net: hns3: fix return of random stack value +- net: hns3: cleanup for endian issue for VF RSS +- net: hns3: remove unused macro definition +- net: hns3: remove an unused parameter in hclge_vf_rate_param_check() +- net: hns3: remove redundant return value of hns3_uninit_all_ring() +- net: hns3: change hclge_query_bd_num() param type +- net: hns3: change hclge_parse_speed() param type +- net: hns3: modify some unmacthed types print parameter +- net: hns3: clean up unnecessary parentheses in macro definitions +- net: hns3: remove the shaper param magic number +- net: hns3: remove redundant client_setup_tc handle +- net: hns3: clean up some incorrect variable types in hclge_dbg_dump_tm_map() +- net: hns3: replace macro of max qset number with specification +- net: hns3: debugfs add max tm rate specification print +- net: hns3: add support for obtaining the maximum frame size +- net: hns3: optimize the code when update the tc info +- net: hns3: RSS indirection table use device specification +- net: hns3: add api capability bits for firmware +- net: hns3: remove redundant null check of an array +- net: hns3: add debugfs support for tm nodes, priority and qset info +- net: hns3: add interfaces to query information of tm priority/qset +- x86/perf: Add uncore performance monitor support for Zhaoxin CPUs +- iommu/vt-d:Add support for detecting ACPI device, in RMRR +- USB:Fix kernel NULL pointer when unbind UHCI form vfio-pci +- xhci: fix issue with resume from system Sx state +- xhci: Adjust the UHCI Controllers bit value +- ALSA: hda: Add support of Zhaoxin NB HDAC codec +- ALSA: hda: Add support of Zhaoxin NB HDAC +- ALSA: hda: Add Zhaoxin SB HDAC non snoop +- xhci: Show Zhaoxin XHCI root hub speed correctly +- xhci: fix issue of cross page boundary in TRB prefetch +- xhci: Add Zhaoxin xHCI LPM U1/U2 feature support +- ata: sata_zhaoxin: Add support for Zhaoxin Serial ATA +- crypto: x86/crc32c-intel - Don't match some Zhaoxin CPUs +- Add MCA supprot for X86_VENDOR_CENTAUR CPUs +- Add support for extended topology detection +- Get locgical processors numbers bits per package +- ima: fix CONFIG_IMA_DIGEST_DB_MEGABYTES in openeuler_defconfig +- usb: gadget: rndis: Fix info leak of rndis +- crypto: hisilicon/qm - implement for querying hardware tasks status. +- crypto: hisilicon/sec - Fix spelling mistake "fallbcak" -> "fallback" +- crypto: hisilicon/zip - adds the max shaper type rate +- crypto: hisilicon/hpre - adds the max shaper type rate +- crypto: hisilicon/sec - adds the max shaper type rate +- crypto: hisilicon/qm - supports to inquiry each function's QoS +- crypto: hisilicon/qm - add pf ping single vf function +- crypto: hisilicon/qm - merges the work initialization process into a single function +- crypto: hisilicon/qm - add the "alg_qos" file node +- crypto: hisilicon/qm - supports writing QoS int the host +- uacce: add print information if not enable sva +- crypto: hisilicon/sec - modify the SEC request structure +- crypto: hisilicon/sec - add hardware integrity check value process +- crypto: hisilicon/sec - add fallback tfm supporting for aeads +- crypto: hisilicon/sec - add new algorithm mode for AEAD +- crypto: hisilicon/qm - update reset flow +- crypto: hisilicon/qm - add callback to support communication +- crypto: hisilicon/qm - enable PF and VFs communication +- crypto: hisilicon/qm - adjust reset interface +- crypto: hisilicon/hpre - register ecdh NIST P384 +- crypto: hisilicon/hpre - add check before gx modulo p +- crypto: hisilicon/hpre - fix ecdh self test issue +- crypto: hisilicon/sec - fixup 3des minimum key size declaration +- crypto: hisilicon/sec - add fallback tfm supporting for XTS mode +- crypto: hisilicon/sec - add new skcipher mode for SEC +- crypto: hisilicon/sec - driver adapt to new SQE +- crypto: hisilicon/sec - add new type of SQE +- crypto: hisilicon - switch to memdup_user_nul() +- crypto: ecdh - add test suite for NIST P384 +- crypto: ecdh - register NIST P384 tfm +- crypto: ecdh - fix 'ecdh_init' +- crypto: ecdh - fix ecdh-nist-p192's entry in testmgr +- crypto: hisilicon/qm - support address prefetching +- crypto: hisilicon/qm - add MSI detection steps on Kunpeng930 +- crypto: hisilicon/qm - fix the process of VF's list adding +- crypto: hisilicon/qm - add dfx log if not use hardware crypto algs +- crypto: hisilicon/qm - enable to close master ooo when NFE occurs +- crypto: hisilicon/qm - adjust order of device error configuration +- crypto: hisilicon/qm - modify 'QM_RESETTING' clearing error +- crypto: hisilicon/qm - initialize the device before doing tasks +- crypto: hisilicon/hpre - add 'default' for switch statement +- crypto: hisilicon/hpre - delete rudundant macro definition +- crypto: hisilicon/hpre - use 'GENMASK' to generate mask value +- crypto: hisilicon/hpre - delete rudundant initialization +- crypto: hisilicon/hpre - remove the macro of 'HPRE_DEV' +- crypto: hisilicon/hpre - replace macro with inline function +- crypto: hisilicon/hpre - init a structure member each line +- crypto: hisilicon/hpre - the macro 'HPRE_ADDR' expands +- crypto: hisilicon/hpre - fix unmapping invalid dma address +- crypto: hisilicon/hpre - extend 'cra_driver_name' with curve name +- crypto: ecdh - extend 'cra_driver_name' with curve name +- crypto: testmgr - fix initialization of 'secret_size' +- crypto: hisilicon - enable new error types for QM +- crypto: hisilicon - add new error type for SEC +- crypto: hisilicon - support new error types for ZIP +- crypto: hisilicon - dynamic configuration 'err_info' +- crypto: hisilicon/hpre - delete redundant log and return in advance +- crypto: hisilicon/hpre - add debug log +- crypto: hisilicon/hpre - use the correct variable type +- crypto: hisilicon/hpre - delete the rudundant space after return +- crypto: hisilicon/sgl - fix the sg buf unmap +- crypto: hisilicon/sgl - fix the soft sg map to hardware sg +- crypto: hisilicon/sgl - add some dfx logs +- crypto: hisilicon/sgl - delete unneeded variable initialization +- crypto: hisilicon/sgl - add a comment for block size initialization +- crypto: hisilicon/sec - use the correct print format +- crypto: hisilicon/trng - add version to adapt new algorithm +- crypto: hisilicon/qm - add stop queue by hardware +- crypto: ecc - delete a useless function declaration +- crypto: hisilicon/qm - delete redundant code +- crypto: hisilicon/sec - fixup checking the 3DES weak key +- crypto: hisilicon/hpre - fix a typo in hpre_crypto.c +- crypto: hisilicon/sec - Fix a module parameter error +- crypto: hisilicon/sec - Fixes AES algorithm mode parameter problem +- crypto: hisilicon/hpre - Add processing of src_data in 'CURVE25519' +- crypto: hisilicon/hpre - delete redundant '\n' +- crypto: hisilicon/hpre - fix a typo and delete redundant blank line +- crypto: hisilicon/hpre - fix PASID setting on kunpeng 920 +- crypto: hisilicon/zip - support new 'sqe' type in Kunpeng930 +- crypto: hisilicon/zip - initialize operations about 'sqe' in 'acomp_alg.init' +- crypto: hisilicon/zip - add comments for 'hisi_zip_sqe' +- crypto: hisilicon/zip - adjust functions location +- uacce: delete unneeded variable initialization +- crypto: hisilicon - use the correct HiSilicon copyright +- crypto: hisilicon/qm - add queue isolation support for Kunpeng930 +- crypto: hisilicon/qm - set the number of queues for function +- crypto: hisilicon/qm - move 'CURRENT_QM' code to qm.c +- crypto: hisilicon/qm - set the total number of queues +- crypto: hisilicon/hpre - fix Kconfig +- crypto: hisilicon/hpre - fix "hpre_ctx_init" resource leak +- crypto: hisilicon - fix the check on dma address +- crypto: hisilicon/hpre - optimise 'hpre_algs_register' error path +- crypto: hisilicon/hpre - delete wrap of 'CONFIG_CRYPTO_DH' +- crypto: ecc - Correct an error in the comments +- crypto: hisilicon/sec - Supply missing description for 'sec_queue_empty()'s 'queue' param +- crypto: ecdsa - Register NIST P384 and extend test suite +- crypto: ecc - Add math to support fast NIST P384 +- crypto: ecc - Add NIST P384 curve parameters +- crypto: ecdsa - Add support for ECDSA signature verification +- oid_registry: Add OIDs for ECDSA with SHA224/256/384/512 +- crypto: hisilicon/sec - fixes some driver coding style +- crypto: hisilicon/sec - fixes some coding style +- crypto: hisilicon/hpre - add 'CURVE25519' algorithm +- crypto: hisilicon/hpre - add 'ECDH' algorithm +- crypto: ecc - add curve25519 params and expose them +- crypto: ecc - expose ecc curves +- crypto: ecdh - move curve_id of ECDH from the key to algorithm name +- crypto: hisilicon/hpre - add algorithm type +- crypto: hisilicon/hpre - add version adapt to new algorithms +- crypto: hisilicon/qm - fix printing format issue +- crypto: hisilicon/qm - do not reset hardware when CE happens +- crypto: hisilicon/qm - update irqflag +- crypto: hisilicon/qm - fix the value of 'QM_SQC_VFT_BASE_MASK_V2' +- crypto: hisilicon/qm - fix request missing error +- crypto: hisilicon/qm - removing driver after reset +- crypto: hisilicon/hpre - enable Elliptic curve cryptography +- crypto: hisilicon - PASID fixed on Kunpeng 930 +- crypto: hisilicon/qm - fix use of 'dma_map_single' +- crypto: hisilicon/hpre - tiny fix +- crypto: hisilicon/hpre - adapt the number of clusters +- crypto: hisilicon/hpre - add ecc algorithm inqury for uacce device +- crypto: hisilicon/hpre - add two RAS correctable errors processing +- crypto: hisilicon/hpre - delete ECC 1bit error reported threshold +- crypto: hisilicon/sec - register SEC device to uacce +- crypto: hisilicon/hpre - register HPRE device to uacce +- crypto: hisilicon - add ZIP device using mode parameter +- crypto: hisilicon/qm - SVA bugfixed on Kunpeng920 +- crypto: hisilicon/trng - replace atomic_add_return() +- crypto: hisilicon/trng - add support for PRNG +- crypto: hisilicon/trng - add HiSilicon TRNG driver support +- hwrng: hisi - remove HiSilicon TRNG driver +- crypto: hisilicon/zip - add a work_queue for zip irq +- crypto: sha - split sha.h into sha1.h and sha2.h +- uacce: modify the module author information. +- uacce: delete some redundant code. +- crypto: hisilicon/sec2 - Fix aead authentication setting key error +- crypto: hisilicon/qm - split 'hisi_qm_init' into smaller pieces +- crypto: hisilicon/qm - split 'qm_eq_ctx_cfg' into smaller pieces +- crypto: hisilicon/qm - split 'qm_qp_ctx_cfg' into smaller pieces +- crypto: hisilicon/qm - replace 'sprintf' with 'scnprintf' +- crypto: hisilicon/qm - modify return type of 'qm_set_sqctype' +- crypto: hisilicon/qm - modify the return type of debugfs interface +- crypto: hisilicon/qm - modify the return type of function +- crypto: hisilicon/qm - numbers are replaced by macros +- crypto: hisilicon - fixes some coding style +- crypto: hisilicon - delete unused structure member variables +- crypto: hisilicon - Fix doc warnings in sgl.c and qm.c +- RDMA/hns: Add window selection field of congestion control +- RDMA/hns: Fix incorrect vlan enable bit in QPC +- RDMA/hns: Add vendor_err info to error WC +- RDMA/hns: Fix spelling mistakes of original +- RDMA/hns: Simplify the judgment in hns_roce_v2_post_send() +- RDMA/hns: Encapsulate flushing CQE as a function +- RDMA/hns: Modify function return value type +- RDMA/hns: Clean definitions of EQC structure +- RDMA/hns: Delete unnecessary branch of hns_roce_v2_query_qp +- RDMA/hns: Add member assignments for qp_init_attr +- RDMA/hns: Fix some print issues +- RDMA/hns: Fix uninitialized variable +- RDMA/hns: Force rewrite inline flag of WQE +- RDMA/hns: Use IDA interface to manage xrcd index +- RDMA/hns: Use IDA interface to manage pd index +- RDMA/hns: Use IDA interface to manage mtpt index +- RDMA/hns: Remove unused RR mechanism +- RDMA/hns: Remove the unused hns_roce_bitmap_free_range function +- RDMA/hns: Remove the unused hns_roce_bitmap_alloc_range function +- RDMA/hns: Clean SRQC structure definition +- RDMA/hns: Use new interface to write DB related fields +- RDMA/hns: Use new interface to write FRMR fields +- RDMA/hns: Use new interface to get CQE fields +- RDMA/hns: Use new interface to modify QP context +- RDMA/hns: Use new interface to write CQ context. +- RDMA/hns: Add hr_reg_write_bool() +- RDMA/hns: Add a check to ensure integer mtu is positive +- RDMA/hns: Do not use !! for values that are already bool when calling hr_reg_write() +- RDMA/hns: Clear extended doorbell info before using +- RDMA/hns: Support getting max QP number from firmware +- RDMA/hns: Use refcount_t instead of atomic_t for QP reference counting +- RDMA/hns: Use refcount_t instead of atomic_t for SRQ reference counting +- RDMA/hns: Use refcount_t instead of atomic_t for CQ reference counting +- RDMA/hns: Refactor capability configuration flow of VF +- RDMA/hns: Clean the hardware related code for HEM +- RDMA/hns: Use refcount_t APIs for HEM +- RDMA/hns: Fix wrong timer context buffer page size +- RDMA/hns: Refactor root BT allocation for MTR +- RDMA/hns: Remove unused CMDQ member +- RDMA/hns: Remove Receive Queue of CMDQ +- RDMA/hns: Rename CMDQ head/tail pointer to PI/CI +- RDMA/hns: Refactor extend link table allocation +- RDMA/hns: Remove unused parameter udata +- RDMA/hns: Remove the condition of light load for posting DWQE +- RDMA/hns: Remove duplicated hem page size config code +- RDMA/hns: Enable RoCE on virtual functions +- RDMA/hns: Set parameters of all the functions belong to a PF +- RDMA/hns: Reserve the resource for the VFs +- RDMA/hns: Query the number of functions supported by the PF +- RDMA/hns: Simplify function's resource related command +- RDMA/hns: Remove unnecessary flush operation for workqueue +- RDMA/hns: Prevent le32 from being implicitly converted to u32 +- RDMA/hns: Simplify the function config_eqc() +- RDMA/hns: Add XRC subtype in QPC and XRC type in SRQC +- RDMA/hns: Remove unsupported QP types +- RDMA/hns: Delete unused members in the structure hns_roce_hw +- RDMA/hns: Delete redundant abnormal interrupt status +- RDMA/hns: Delete redundant condition judgment related to eq +- RDMA/hns: Fix missing assignment of max_inline_data +- RDMA/hns: Avoid enabling RQ inline on UD +- RDMA/hns: Modify prints for mailbox and command queue +- RDMA/hns: Support more return types of command queue +- RDMA/hns: Enable all CMDQ context +- RDMA/hns: Use GFP_ATOMIC under spin lock +- RDMA/hns: Reorganize doorbell update interfaces for all queues +- RDMA/hns: Support configuring doorbell mode of RQ and CQ +- RDMA/hns: Simplify command fields for HEM base address configuration +- RDMA/hns: Reorganize process of setting HEM +- RDMA/hns: Refactor reset state checking flow +- RDMA/hns: Reorganize hns_roce_create_cq() +- RDMA/hns: Refactor hns_roce_v2_poll_one() +- RDMA/hns: Support congestion control type selection according to the FW +- RDMA/hns: Support query information of functions from FW +- RDMA/hns: Fix a spelling mistake in hns_roce_hw_v1.c +- RDMA/hns: Support to query firmware version +- RDMA/hns: Fix memory corruption when allocating XRCDN +- RDMA/hns: Fix bug during CMDQ initialization +- RDMA/hns: Add support for XRC on HIP09 +- RDMA/hns: Use new SQ doorbell register for HIP09 +- RDMA/hns: Adjust definition of FRMR fields +- RDMA/hns: Refactor process of posting CMDQ +- RDMA/hns: Adjust fields and variables about CMDQ tail/head +- RDMA/hns: Remove redundant operations on CMDQ +- RDMA/hns: Remove unused member and variable of CMDQ +- RDMA/hns: Delete redundant judgment when preparing descriptors +- RDMA/hns: Remove unnecessary wrap around for EQ's consumer index +- RDMA/hns: Avoid unnecessary memset on WQEs in post_send +- RDMA/hns: Remove some magic numbers +- RDMA/hns: Move HIP06 related definitions into hns_roce_hw_v1.h +- RDMA/hns: Replace wmb&__raw_writeq with writeq +- RDMA/hns: Skip qp_flow_control_init() for HIP09 +- RDMA/hns: Add mapped page count checking for MTR +- RDMA/hns: Avoid filling sgid index when modifying QP to RTR +- RDMA/hns: Add support of direct wqe +- RDMA/hns: Add verification of QP type when post_recv +- RDMA/hns: Refactor hns_roce_v2_post_srq_recv() +- RDMA/hns: Clear remaining unused sges when post_recv +- RDMA/hns: Refactor post recv flow +- RDMA/hns: Use new interfaces to write SRQC +- RDMA/hns: Refactor code about SRQ Context +- RDMA/hns: Refactor hns_roce_create_srq() +- RDMA/hns: Remove the reserved WQE of SRQ +- RDMA/hns: Force srq_limit to 0 when creating SRQ +- RDMA/hns: Bugfix for checking whether the srq is full when post wr +- RDMA/hns: Allocate one more recv SGE for HIP08 +- RDMA/hns: Use new interface to set MPT related fields +- RDMA/hns: Optimize the MR registration process +- RDMA/hns: Refactor the MTR creation flow +- RDMA/hw/hns/hns_roce_mr: Add missing description for 'hr_dev' param +- RDMA/hw/hns/hns_roce_hw_v1: Fix doc-rot issue relating to 'rereset' +- RDMA/hns: Use mutex instead of spinlock for ida allocation +- RDMA/hns: Create CQ with selected CQN for bank load balance +- RDMA/hns: remove h from printk format specifier +- RDMA/hns: Simplify AEQE process for different types of queue +- RDMA/hns: Fix inaccurate prints +- RDMA/hns: Fix incorrect symbol types +- RDMA/hns: Clear redundant variable initialization +- RDMA/hns: Fix coding style issues +- RDMA/hns: Remove unnecessary access right set during INIT2INIT +- RDMA/hns: WARN_ON if get a reserved sl from users +- RDMA/hns: Move capability flags of QP and CQ to hns-abi.h +- RDMA/hns: Refactor process of setting extended sge +- RDMA/hns: Add support for QP stash +- RDMA/hns: Add support for CQ stash +- RDMA/hns: Create QP with selected QPN for bank load balance +- RDMA/hns: Add UD support for HIP09 +- RDMA/hns: Simplify process of filling UD SQ WQE +- RDMA/hns: Remove the portn field in UD SQ WQE +- RDMA/hns: Refactor the hns_roce_buf allocation flow +- RDMA/hns: Add new PCI device ID matching for HIP09 +- RDMA/hns: Support owner mode doorbell +- RDMA/hns: Fix double free of the pointer to TSQ/TPQ +- RDMA/hns: Add support for filling GMV table +- RDMA/hns: Add support for configuring GMV table +- iommu/arm-smmu-v3: Remove the redundant shift operation of 'size' +- iommu/arm-smmu-v3: Standardize granule size when support RIL +- iommu/arm-smmu-v3: Align invalid range with leaf page size upwards when support RIL +- iommu/arm-smmu-v3: Change the TLBI CMD in arm_smmu_cache_invalidate() +- iommu/io-pgtable-arm: Remove the limitation on the page table format of sync/clear_dirty_log() +- iommu/io-pgtable-arm: Make data access permissions of stage1/2 compatible +- iommu/arm-smmu-v3: Using HTTU with SMMU STE and stage 2 TTD +- vfio/pci: Inject page response upon response region fill +- vfio/pci: Register a DMA fault response region +- vfio: Document nested stage control +- vfio/pci: Register and allow DMA FAULT IRQ signaling +- vfio: Add new IRQ for DMA fault reporting +- vfio/pci: Add framework for custom interrupt indices +- vfio: Use capability chains to handle device specific irq +- vfio/pci: Allow to mmap the fault queue +- vfio/pci: Register an iommu fault handler +- vfio/pci: Add VFIO_REGION_TYPE_NESTED region type +- vfio: VFIO_IOMMU_SET_MSI_BINDING +- vfio: VFIO_IOMMU_CACHE_INVALIDATE +- vfio: VFIO_IOMMU_SET_PASID_TABLE +- iommu/smmuv3: report additional recoverable faults +- iommu/smmuv3: Implement bind/unbind_guest_msi +- iommu/smmuv3: Enforce incompatibility between nested mode and HW MSI regions +- iommu/smmuv3: Nested mode single MSI doorbell per domain enforcement +- dma-iommu: Implement NESTED_MSI cookie +- iommu/smmuv3: Implement cache_invalidate +- iommu/smmuv3: Allow stage 1 invalidation with unmanaged ASIDs +- iommu/smmuv3: Implement attach/detach_pasid_table +- iommu/smmuv3: Get prepared for nested stage support +- iommu/smmuv3: Allow s1 and s2 configs to coexist +- iommu: Introduce bind/unbind_guest_msi +- iommu: Introduce attach/detach_pasid_table API +- config: Enable CONFIG_USERSWAP +- userswap: support userswap via userfaultfd +- userswap: add a new flag 'MAP_REPLACE' for mmap() +- ima: don't allow control characters in policy path +- ima: Add max size for IMA digest database +- net: hns3: replace skb->csum_not_inet with skb_csum_is_sctp +- net: ixgbevf: use skb_csum_is_sctp instead of protocol check +- net: ixgbe: use skb_csum_is_sctp instead of protocol check +- net: igc: use skb_csum_is_sctp instead of protocol check +- net: igbvf: use skb_csum_is_sctp instead of protocol check +- net: igb: use skb_csum_is_sctp instead of protocol check +- net: add inline function skb_csum_is_sctp +- net: hns3: fix expression that is currently always true +- net: hns3: adjust rss tc mode configure command +- net: hns3: adjust rss indirection table configure command +- net: hns3: add support for max 512 rss size +- net: hns3: add support for hw tc offload of tc flower +- net: hns3: add support for forwarding packet to queues of specified TC when flow director rule hit +- net: hns3: add support for tc mqprio offload +- net: hns3: refine the struct hane3_tc_info +- hisilicon/hns3: convert comma to semicolon +- net: use the new dev_page_is_reusable() instead of private versions +- net: introduce common dev_page_is_reusable() +- skbuff: constify skb_propagate_pfmemalloc() "page" argument +- mm: constify page_is_pfmemalloc() argument +- net: hns3: refine the VLAN tag handle for port based VLAN +- net: hns3: add priv flags support to switch limit promisc mode +- net: hns3: add support for extended promiscuous command +- KVM: arm64: GICv4.1: Give a chance to save VLPI state +- KVM: arm64: GICv4.1: Restore VLPI pending state to physical side +- KVM: arm64: GICv4.1: Try to save VLPI state in save_pending_tables +- KVM: arm64: GICv4.1: Add function to get VLPI state +- irqchip/gic-v3-its: Drop the setting of PTZ altogether +- irqchip/gic-v3-its: Add a cache invalidation right after vPE unmapping +- net: hns3: keep MAC pause mode when multiple TCs are enabled +- net: hns3: add a check for devcie's verion in hns3_tunnel_csum_bug() +- net: hns3: add more info to hns3_dbg_bd_info() +- net: hns3: add udp tunnel checksum segmentation support +- net: hns3: remove unsupported NETIF_F_GSO_UDP_TUNNEL_CSUM +- net: hns3: add support for TX hardware checksum offload +- net: hns3: add support for RX completion checksum +- vfio/iommu_type1: Add support for manual dirty log clear +- vfio/iommu_type1: Optimize dirty bitmap population based on iommu HWDBM +- vfio/iommu_type1: Add HWDBM status maintenance +- iommu/arm-smmu-v3: Realize support_dirty_log iommu ops +- iommu/arm-smmu-v3: Realize clear_dirty_log iommu ops +- iommu/arm-smmu-v3: Realize sync_dirty_log iommu ops +- iommu/arm-smmu-v3: Realize switch_dirty_log iommu ops +- iommu/arm-smmu-v3: Add feature detection for BBML +- iommu/arm-smmu-v3: Enable HTTU for stage1 with io-pgtable mapping +- iommu/io-pgtable-arm: Add and realize clear_dirty_log ops +- iommu/io-pgtable-arm: Add and realize sync_dirty_log ops +- iommu/io-pgtable-arm: Add and realize merge_page ops +- iommu/io-pgtable-arm: Add and realize split_block ops +- iommu/io-pgtable-arm: Add quirk ARM_HD and ARM_BBMLx +- iommu: Introduce dirty log tracking framework +- vfio/iommu_type1: Mantain a counter for non_pinned_groups +- fs/filescontrol.c: fix warning:large integer implicitly truncated to unsigned type +- irqchip/gic-v4.1: Reduce the delay when polling GICR_VPENDBASER.Dirty +- KVM: arm64: Delay the polling of the GICR_VPENDBASER.Dirty bit +- KVM: arm64: Make use of TWED feature +- arm64: cpufeature: TWED support detection +- move ETMEM feature CONFIG to mm/Kconfig and add architecture dependency +- x86/config: Set CONFIG_TXGBE=m by default +- net: txgbe: Add support for Netswift 10G NIC +- net: hns3: fix spelling mistake "memroy" -> "memory" +- net: hns3: adds debugfs to dump more info of shaping parameters +- net: hns3: add support to utilize the firmware calculated shaping parameters +- net: hns3: add support for pf querying new interrupt resources +- net: hns3: add support for mapping device memory +- net: hns3: add support for 1280 queues +- net: hns3: rename gl_adapt_enable in struct hns3_enet_coalesce +- net: hns3: add support for 1us unit GL configuration +- net: hns3: add support for querying maximum value of GL +- net: hns3: add support for configuring interrupt quantity limiting +- net: hns3: Remove duplicated include +- locking/qspinlock: Disable CNA by default +- locking/qspinlock: Add CNA support for ARM64 +- KVM: arm64: Rename 'struct pv_sched_ops' +- locking/qspinlock: Introduce the shuffle reduction optimization into CNA +- locking/qspinlock: Avoid moving certain threads between waiting queues in CNA +- locking/qspinlock: Introduce starvation avoidance into CNA +- locking/qspinlock: Introduce CNA into the slow path of qspinlock +- locking/qspinlock: Refactor the qspinlock slow path +- locking/qspinlock: Rename mcs lock/unlock macros and make them more generic +- mm/page_alloc: do bulk array bounds check after checking populated elements +- mm/page_alloc: __alloc_pages_bulk(): do bounds check before accessing array +- net: page_pool: use alloc_pages_bulk in refill code path +- net: page_pool: refactor dma_map into own function page_pool_dma_map +- SUNRPC: refresh rq_pages using a bulk page allocator +- SUNRPC: set rq_page_end differently +- mm/page_alloc: inline __rmqueue_pcplist +- mm/page_alloc: optimize code layout for __alloc_pages_bulk +- mm/page_alloc: add an array-based interface to the bulk page allocator +- mm/page_alloc: add a bulk page allocator +- mm/page_alloc: rename alloced to allocated +- mm/mempolicy: fix mpol_misplaced kernel-doc +- mm/mempolicy: rewrite alloc_pages_vma documentation +- mm/mempolicy: rewrite alloc_pages documentation +- mm/mempolicy: rename alloc_pages_current to alloc_pages +- mm/page_alloc: combine __alloc_pages and __alloc_pages_nodemask +- mm/page_alloc: rename gfp_mask to gfp +- mm/page_alloc: rename alloc_mask to alloc_gfp +- mm/filemap: fix infinite loop in generic_file_buffered_read() +- mm/filemap.c: generic_file_buffered_read() now uses find_get_pages_contig +- mm/filemap/c: break generic_file_buffered_read up into multiple functions +- powerpc/mm: enable HAVE_MOVE_PMD support +- powerpc/book3s64/mm: update flush_tlb_range to flush page walk cache +- mm/mremap: allow arch runtime override +- powerpc/64s/radix: refactor TLB flush type selection +- mm/mremap: hold the rmap lock in write mode when moving page table entries. +- mm/mremap: use pmd/pud_poplulate to update page table entries +- mm/mremap: don't enable optimized PUD move if page table levels is 2 +- mm/mremap: convert huge PUD move to separate helper +- selftest/mremap_test: avoid crash with static build +- selftest/mremap_test: update the test to handle pagesize other than 4K +- mm: rename p4d_page_vaddr to p4d_pgtable and make it return pud_t * +- mm: rename pud_page_vaddr to pud_pgtable and make it return pmd_t * +- mm/mremap.c: fix extent calculation +- arm64: mremap speedup - enable HAVE_MOVE_PUD +- x86: mremap speedup - Enable HAVE_MOVE_PUD +- mm: speedup mremap on 1GB or larger regions +- kselftests: vm: add mremap tests +- sched: Limit the amount of NUMA imbalance that can exist at fork time +- sched/numa: Allow a floating imbalance between NUMA nodes +- sched: Avoid unnecessary calculation of load imbalance at clone time +- sched/numa: Rename nr_running and break out the magic number +- mm/vmstat.c: erase latency in vmstat_shepherd +- mm, slub: splice cpu and page freelists in deactivate_slab() +- mm: memcontrol: optimize per-lruvec stats counter memory usage +- vsprintf: dump full information of page flags in pGp +- mm, slub: don't combine pr_err with INFO +- mm, slub: use pGp to print page flags +- RDMA/umem: batch page unpin in __ib_umem_release() +- mm/gup: add a range variant of unpin_user_pages_dirty_lock() +- mm/gup: decrement head page once for group of subpages +- mm/gup: add compound page list iterator +- mm, slab, slub: stop taking cpu hotplug lock +- mm, slab, slub: stop taking memory hotplug lock +- mm, slub: stop freeing kmem_cache_node structures on node offline +- sched: Unthrottle qos cfs rq when free a task group +- sched: Fix offline task can't be killed in a timely +- sched: Unthrottle the throttled cfs rq when offline rq +- sched: Enable qos scheduler config +- sched: Throttle qos cfs_rq when current cpu is running online task +- sched: Introduce qos scheduler for co-location +- smp: Inline on_each_cpu_cond() and on_each_cpu() +- x86/mm/tlb: Remove unnecessary uses of the inline keyword +- cpumask: Mark functions as pure +- x86/mm/tlb: Do not make is_lazy dirty for no reason +- x86/mm/tlb: Privatize cpu_tlbstate +- x86/mm/tlb: Flush remote and local TLBs concurrently +- x86/mm/tlb: Open-code on_each_cpu_cond_mask() for tlb_is_not_lazy() +- x86/mm/tlb: Unify flush_tlb_func_local() and flush_tlb_func_remote() +- smp: Run functions concurrently in smp_call_function_many_cond() +- smp: Cleanup smp_call_function*() +- mm: migrate: fix missing update page_private to hugetlb_page_subpool +- arm64: mm: hugetlb: add support for free vmemmap pages of HugeTLB +- mm: hugetlb: introduce CONFIG_HUGETLB_PAGE_FREE_VMEMMAP_DEFAULT_ON +- mm: sparsemem: use huge PMD mapping for vmemmap pages +- mm: sparsemem: split the huge PMD mapping of vmemmap pages +- mm: hugetlb: introduce nr_free_vmemmap_pages in the struct hstate +- mm: hugetlb: add a kernel parameter hugetlb_free_vmemmap +- mm: hugetlb: alloc the vmemmap pages associated with each HugeTLB page +- mm: hugetlb: defer freeing of HugeTLB pages +- mm: hugetlb: free the vmemmap pages associated with each HugeTLB page +- mm: hugetlb: gather discrete indexes of tail page +- mm: hugetlb: introduce a new config HUGETLB_PAGE_FREE_VMEMMAP +- mm: memory_hotplug: factor out bootmem core functions to bootmem_info.c +- hugetlb: add lockdep_assert_held() calls for hugetlb_lock +- hugetlb: make free_huge_page irq safe +- hugetlb: change free_pool_huge_page to remove_pool_huge_page +- hugetlb: call update_and_free_page without hugetlb_lock +- hugetlb: create remove_hugetlb_page() to separate functionality +- hugetlb: add per-hstate mutex to synchronize user adjustments +- hugetlb: no need to drop hugetlb_lock to call cma_release +- mm/cma: change cma mutex to irq safe spinlock +- hugetlb: convert PageHugeFreed to HPageFreed flag +- hugetlb: convert PageHugeTemporary() to HPageTemporary flag +- hugetlb: convert page_huge_active() HPageMigratable flag +- hugetlb: use page.private for hugetlb specific page flags +- powerpc: Fix reverse map real-mode address lookup with huge vmalloc +- mm/vmalloc: unbreak kasan vmalloc support +- KVM: s390: prepare for hugepage vmalloc +- mm/vmalloc: add vmalloc_no_huge +- mm/ioremap: fix iomap_max_page_shift +- mm/vmalloc: improve allocation failure error messages +- mm/vmalloc: use free_vm_area() if an allocation fails +- powerpc/64s/radix: Enable huge vmalloc mappings +- mm/vmalloc: hugepage vmalloc mappings +- mm/vmalloc: add vmap_range_noflush variant +- mm: move vmap_range from mm/ioremap.c to mm/vmalloc.c +- mm/vmalloc: provide fallback arch huge vmap support functions +- x86: inline huge vmap supported functions +- arm64: inline huge vmap supported functions +- powerpc: inline huge vmap supported functions +- mm: HUGE_VMAP arch support cleanup +- mm/ioremap: rename ioremap_*_range to vmap_*_range +- mm/vmalloc: rename vmap_*_range vmap_pages_*_range +- mm: apply_to_pte_range warn and fail if a large pte is encountered +- mm/vmalloc: fix HUGE_VMAP regression by enabling huge pages in vmalloc_to_page +- ARM: mm: add missing pud_page define to 2-level page tables +- mm/vmalloc.c:__vmalloc_area_node(): avoid 32-bit overflow +- mm/lru: revise the comments of lru_lock +- mm/lru: introduce relock_page_lruvec() +- mm/lru: replace pgdat lru_lock with lruvec lock +- mm/swap.c: serialize memcg changes in pagevec_lru_move_fn +- mm/compaction: do page isolation first in compaction +- mm/lru: introduce TestClearPageLRU() +- mm/mlock: remove __munlock_isolate_lru_page() +- mm/mlock: remove lru_lock on TestClearPageMlocked +- mm/vmscan: remove lruvec reget in move_pages_to_lru +- mm/lru: move lock into lru_note_cost +- mm/swap.c: fold vm event PGROTATED into pagevec_move_tail_fn +- mm/memcg: add debug checking in lock_page_memcg +- mm: page_idle_get_page() does not need lru_lock +- mm/rmap: stop store reordering issue on page->mapping +- mm/vmscan: remove unnecessary lruvec adding +- mm/thp: narrow lru locking +- mm/thp: simplify lru_add_page_tail() +- mm/thp: use head for head page in lru_add_page_tail() +- mm/thp: move lru_add_page_tail() to huge_memory.c +- mm/swap: remove unused local variable nr_shadows +- mm: remove nrexceptional from inode: remove BUG_ON +- mm: remove nrexceptional from inode +- dax: account DAX entries as nrpages +- mm: stop accounting shadow entries +- mm: introduce and use mapping_empty() +- mm/filemap: fix find_lock_entries hang on 32-bit THP +- mm/filemap: fix mapping_seek_hole_data on THP & 32-bit +- mm/highmem.c: fix zero_user_segments() with start > end +- mm: remove pagevec_lookup_entries +- mm: pass pvec directly to find_get_entries +- mm: remove nr_entries parameter from pagevec_lookup_entries +- mm: add an 'end' parameter to pagevec_lookup_entries +- mm: add an 'end' parameter to find_get_entries +- mm: add and use find_lock_entries +- iomap: use mapping_seek_hole_data +- mm/filemap: add mapping_seek_hole_data +- mm/filemap: add helper for finding pages +- mm/filemap: rename find_get_entry to mapping_get_entry +- mm: add FGP_ENTRY +- mm/swap: optimise get_shadow_from_swap_cache +- mm/shmem: use pagevec_lookup in shmem_unlock_mapping +- mm: make pagecache tagged lookups return only head pages +- mm: support THPs in zero_user_segments +- mm: vmstat: add cma statistics +- memcg: enable memcg oom-kill for __GFP_NOFAIL +- mm/page_alloc: count CMA pages per zone and print them in /proc/zoneinfo +- mm/page_owner: record the timestamp of all pages during free +- mm/page_owner: record timestamp and pid +- mm/vmalloc: rework the drain logic +- arm64: clear_page: Add new implementation of clear_page() by STNP +- memcg: update the child's qos_level synchronously in memcg_qos_write() +- memcg: Add static key for memcg priority +- memcg: enable CONFIG_MEMCG_QOS by default +- memcg: support priority for oom + +* Wed Jul 14 2021 Cheng Jian - 5.10.0-5.0.0.15 +- add buildrequire: openssl for kernel build +- add buildrequire: perl-devel for perf binary + +* Wed Jul 7 2021 Zheng Zengkai - 5.10.0-5.0.0.14 +- arm64: errata: enable HISILICON_ERRATUM_HIP08_RU_PREFETCH +- arm64: errata: add option to disable cache readunique prefetch on HIP08 +- config: disable config ARM64_BOOTPARAM_HOTPLUG_CPU0 by default +- arm64: Add config switch and kernel parameter for CPU0 hotplug +- iommu/vt-d: Check for allocation failure in aux_detach_device() +- iommu/vt-d: Fix ineffective devTLB invalidation for subdevices +- iommu/vt-d: Fix general protection fault in aux_detach_device() +- NFSv4: Refactor to use user namespaces for nfs4idmap +- NFS: NFSv2/NFSv3: Use cred from fs_context during mount +- seccomp: Remove bogus __user annotations +- seccomp/cache: Report cache data through /proc/pid/seccomp_cache +- xtensa: Enable seccomp architecture tracking +- sh: Enable seccomp architecture tracking +- s390: Enable seccomp architecture tracking +- riscv: Enable seccomp architecture tracking +- powerpc: Enable seccomp architecture tracking +- parisc: Enable seccomp architecture tracking +- csky: Enable seccomp architecture tracking +- arm: Enable seccomp architecture tracking +- arm64: Enable seccomp architecture tracking +- selftests/seccomp: Compare bitmap vs filter overhead +- x86: Enable seccomp architecture tracking +- seccomp/cache: Add "emulator" to check if filter is constant allow +- seccomp/cache: Lookup syscall allowlist bitmap for fast path +- usb: dwc3: core: fix kernel panic when do reboot +- usb: dwc3: debugfs: Add and remove endpoint dirs dynamically +- perf beauty: Update copy of linux/socket.h with the kernel sources +- tools headers UAPI: Sync linux/in.h copy with the kernel sources +- net: fec_ptp: add clock rate zero check +- net: stmmac: disable clocks in stmmac_remove_config_dt() +- mm/slub.c: include swab.h +- mm/slub: actually fix freelist pointer vs redzoning +- mm/slub: fix redzoning for small allocations +- mm/slub: clarify verification reporting +- mm/swap: fix pte_same_as_swp() not removing uffd-wp bit when compare +- net: bridge: fix vlan tunnel dst refcnt when egressing +- net: bridge: fix vlan tunnel dst null pointer dereference +- net: ll_temac: Fix TX BD buffer overwrite +- net: ll_temac: Make sure to free skb when it is completely used +- drm/amdgpu/gfx9: fix the doorbell missing when in CGPG issue. +- drm/amdgpu/gfx10: enlarge CP_MEC_DOORBELL_RANGE_UPPER to cover full doorbell. +- cfg80211: avoid double free of PMSR request +- cfg80211: make certificate generation more robust +- mac80211: Fix NULL ptr deref for injected rate info +- dmaengine: pl330: fix wrong usage of spinlock flags in dma_cyclc +- crash_core, vmcoreinfo: append 'SECTION_SIZE_BITS' to vmcoreinfo +- x86/fpu: Reset state for all signal restore failures +- x86/fpu: Invalidate FPU state after a failed XRSTOR from a user buffer +- x86/fpu: Prevent state corruption in __fpu__restore_sig() +- x86/pkru: Write hardware init value to PKRU when xstate is init +- x86/ioremap: Map EFI-reserved memory as encrypted for SEV +- x86/process: Check PF_KTHREAD and not current->mm for kernel threads +- x86/mm: Avoid truncating memblocks for SGX memory +- ARCv2: save ABI registers across signal handling +- s390/ap: Fix hanging ioctl caused by wrong msg counter +- s390/mcck: fix calculation of SIE critical section size +- KVM: X86: Fix x86_emulator slab cache leak +- KVM: x86/mmu: Calculate and check "full" mmu_role for nested MMU +- KVM: x86: Immediately reset the MMU context when the SMM flag is cleared +- PCI: Work around Huawei Intelligent NIC VF FLR erratum +- PCI: Add ACS quirk for Broadcom BCM57414 NIC +- PCI: aardvark: Fix kernel panic during PIO transfer +- PCI: Mark some NVIDIA GPUs to avoid bus reset +- PCI: Mark TI C667X to avoid bus reset +- tracing: Do no increment trace_clock_global() by one +- tracing: Do not stop recording comms if the trace file is being read +- tracing: Do not stop recording cmdlines when tracing is off +- usb: chipidea: imx: Fix Battery Charger 1.2 CDP detection +- usb: core: hub: Disable autosuspend for Cypress CY7C65632 +- can: mcba_usb: fix memory leak in mcba_usb +- can: j1939: fix Use-after-Free, hold skb ref while in use +- can: bcm/raw/isotp: use per module netdevice notifier +- can: bcm: fix infoleak in struct bcm_msg_head +- bpf: Do not mark insn as seen under speculative path verification +- bpf: Inherit expanded/patched seen count from old aux data +- irqchip/gic-v3: Workaround inconsistent PMR setting on NMI entry +- mm: relocate 'write_protect_seq' in struct mm_struct +- hwmon: (scpi-hwmon) shows the negative temperature properly +- radeon: use memcpy_to/fromio for UVD fw upload +- ASoC: qcom: lpass-cpu: Fix pop noise during audio capture begin +- drm/sun4i: dw-hdmi: Make HDMI PHY into a platform device +- pinctrl: ralink: rt2880: avoid to error in calls is pin is already enabled +- ASoC: rt5682: Fix the fast discharge for headset unplugging in soundwire mode +- regulator: rt4801: Fix NULL pointer dereference if priv->enable_gpios is NULL +- spi: stm32-qspi: Always wait BUSY bit to be cleared in stm32_qspi_wait_cmd() +- ASoC: tas2562: Fix TDM_CFG0_SAMPRATE values +- sched/pelt: Ensure that *_sum is always synced with *_avg +- spi: spi-zynq-qspi: Fix some wrong goto jumps & missing error code +- regulator: rtmv20: Fix to make regcache value first reading back from HW +- ASoC: fsl-asoc-card: Set .owner attribute when registering card. +- phy: phy-mtk-tphy: Fix some resource leaks in mtk_phy_init() +- ASoC: rt5659: Fix the lost powers for the HDA header +- platform/x86: thinkpad_acpi: Add X1 Carbon Gen 9 second fan support +- regulator: bd70528: Fix off-by-one for buck123 .n_voltages setting +- regulator: cros-ec: Fix error code in dev_err message +- net: ethernet: fix potential use-after-free in ec_bhf_remove +- icmp: don't send out ICMP messages with a source address of 0.0.0.0 +- bnxt_en: Call bnxt_ethtool_free() in bnxt_init_one() error path +- bnxt_en: Fix TQM fastpath ring backing store computation +- bnxt_en: Rediscover PHY capabilities after firmware reset +- cxgb4: fix wrong shift. +- net: cdc_eem: fix tx fixup skb leak +- net: hamradio: fix memory leak in mkiss_close +- be2net: Fix an error handling path in 'be_probe()' +- net/mlx5: Reset mkey index on creation +- net/mlx5: E-Switch, Allow setting GUID for host PF vport +- net/mlx5: E-Switch, Read PF mac address +- net/af_unix: fix a data-race in unix_dgram_sendmsg / unix_release_sock +- net: ipv4: fix memory leak in ip_mc_add1_src +- net: fec_ptp: fix issue caused by refactor the fec_devtype +- net: usb: fix possible use-after-free in smsc75xx_bind +- lantiq: net: fix duplicated skb in rx descriptor ring +- net: cdc_ncm: switch to eth%d interface naming +- ptp: improve max_adj check against unreasonable values +- bpf: Fix leakage under speculation on mispredicted branches +- net: qrtr: fix OOB Read in qrtr_endpoint_post +- ipv4: Fix device used for dst_alloc with local routes +- cxgb4: fix wrong ethtool n-tuple rule lookup +- netxen_nic: Fix an error handling path in 'netxen_nic_probe()' +- qlcnic: Fix an error handling path in 'qlcnic_probe()' +- ethtool: strset: fix message length calculation +- net: qualcomm: rmnet: don't over-count statistics +- net: qualcomm: rmnet: Update rmnet device MTU based on real device +- net: make get_net_ns return error if NET_NS is disabled +- net: stmmac: dwmac1000: Fix extended MAC address registers definition +- cxgb4: halt chip before flashing PHY firmware image +- cxgb4: fix sleep in atomic when flashing PHY firmware +- cxgb4: fix endianness when flashing boot image +- alx: Fix an error handling path in 'alx_probe()' +- selftests: mptcp: enable syncookie only in absence of reorders +- mptcp: do not warn on bad input from the network +- mptcp: try harder to borrow memory from subflow under pressure +- sch_cake: Fix out of bounds when parsing TCP options and header +- mptcp: Fix out of bounds when parsing TCP options +- netfilter: synproxy: Fix out of bounds when parsing TCP options +- net/mlx5e: Block offload of outer header csum for UDP tunnels +- net/mlx5: DR, Don't use SW steering when RoCE is not supported +- net/mlx5: DR, Allow SW steering for sw_owner_v2 devices +- net/mlx5: Consider RoCE cap before init RDMA resources +- net/mlx5e: Fix page reclaim for dead peer hairpin +- net/mlx5e: Remove dependency in IPsec initialization flows +- net/sched: act_ct: handle DNAT tuple collision +- rtnetlink: Fix regression in bridge VLAN configuration +- udp: fix race between close() and udp_abort() +- ice: parameterize functions responsible for Tx ring management +- ice: add ndo_bpf callback for safe mode netdev ops +- netfilter: nft_fib_ipv6: skip ipv6 packets from any to link-local +- net: lantiq: disable interrupt before sheduling NAPI +- net: dsa: felix: re-enable TX flow control in ocelot_port_flush() +- net: rds: fix memory leak in rds_recvmsg +- vrf: fix maximum MTU +- net: ipv4: fix memory leak in netlbl_cipsov4_add_std +- libbpf: Fixes incorrect rx_ring_setup_done +- mlxsw: core: Set thermal zone polling delay argument to real value at init +- mlxsw: reg: Spectrum-3: Enforce lowest max-shaper burst size of 11 +- mac80211: fix skb length check in ieee80211_scan_rx() +- batman-adv: Avoid WARN_ON timing related checks +- kvm: LAPIC: Restore guard to prevent illegal APIC register access +- afs: Fix an IS_ERR() vs NULL check +- dmaengine: stedma40: add missing iounmap() on error in d40_probe() +- dmaengine: SF_PDMA depends on HAS_IOMEM +- dmaengine: QCOM_HIDMA_MGMT depends on HAS_IOMEM +- dmaengine: ALTERA_MSGDMA depends on HAS_IOMEM +- dmaengine: xilinx: dpdma: initialize registers before request_irq +- dmaengine: fsl-dpaa2-qdma: Fix error return code in two functions +- dmaengine: idxd: add missing dsa driver unregister +- ext4: fix memory leak in ext4_fill_super +- Revert "Revert "scsi: megaraid_sas: Added support for shared host tagset for cpuhotplug"" +- Revert "block: Fix a lockdep complaint triggered by request queue flushing" +- nvme-loop: use blk_mq_hctx_set_fq_lock_class to set loop's lock class +- blk-mq: add new API of blk_mq_hctx_set_fq_lock_class +- block: check disk exist before trying to add partition +- block: avoid creating invalid symlink file for patitions +- block: take bd_mutex around delete_partitions in del_gendisk +- scsi: remove unused kobj map for sd devie to avoid memleak +- scsi: libsas: Add LUN number check in .slave_alloc callback +- dm btree remove: assign new_root only when removal succeeds +- scsi: libiscsi: Reset max/exp cmdsn during recovery +- scsi: iscsi_tcp: Fix shost can_queue initialization +- scsi: libiscsi: Add helper to calculate max SCSI cmds per session +- scsi: libiscsi: Fix iSCSI host workq destruction +- scsi: libiscsi: Fix iscsi_task use after free() +- scsi: libiscsi: Drop taskqueuelock +- ext4: stop return ENOSPC from ext4_issue_zeroout +- scsi: sd: Call sd_revalidate_disk() for ioctl(BLKRRPART) +- powerpc/fsl_booke/kaslr: rename kaslr-booke32.rst to kaslr-booke.rst and add 64bit part +- powerpc/fsl_booke/64: clear the original kernel if randomized +- powerpc/fsl_booke/64: do not clear the BSS for the second pass +- powerpc/fsl_booke/64: implement KASLR for fsl_booke64 +- powerpc/fsl_booke/64: introduce reloc_kernel_entry() helper +- powerpc/fsl_booke/kaslr: refactor kaslr_legal_offset() and kaslr_early_init() +- arm64: Force NO_BLOCK_MAPPINGS if crashkernel reservation is required +- exec: Move unshare_files to fix posix file locking during exec +- exec: Don't open code get_close_on_exec +- ARM: mm: Fix PXN process with LPAE feature +- ARM: mm: Provide die_kernel_fault() helper +- ARM: mm: Kill page table base print in show_pte() +- ARM: mm: Cleanup access_error() +- ARM: mm: Kill task_struct argument for __do_page_fault() +- ARM: mm: Rafactor the __do_page_fault() +- fanotify: fix copy_event_to_user() fid error clean up +- block: fix inflight statistics of part0 +- debugfs: fix security_locked_down() call for SELinux +- vti6: fix ipv4 pmtu check to honor ip header df +- vti: fix ipv4 pmtu check to honor ip header df +- alinux: random: speed up the initialization of module +- mm: set the sleep_mapped to true for zbud and z3fold +- mm/zswap: add the flag can_sleep_mapped +- kasan: fix null pointer dereference in kasan_record_aux_stack +- bpf: Fix NULL pointer dereference in bpf_get_local_storage() helper +- fib: Return the correct errno code +- net: Return the correct errno code +- net/x25: Return the correct errno code +- rtnetlink: Fix missing error code in rtnl_bridge_notify() +- drm/amd/amdgpu:save psp ring wptr to avoid attack +- drm/amd/display: Fix potential memory leak in DMUB hw_init +- drm/amdgpu: refine amdgpu_fru_get_product_info +- drm/amd/display: Allow bandwidth validation for 0 streams. +- net: ipconfig: Don't override command-line hostnames or domains +- nvme-loop: do not warn for deleted controllers during reset +- nvme-loop: check for NVME_LOOP_Q_LIVE in nvme_loop_destroy_admin_queue() +- nvme-loop: clear NVME_LOOP_Q_LIVE when nvme_loop_configure_admin_queue() fails +- nvme-loop: reset queue count to 1 in nvme_loop_destroy_io_queues() +- scsi: scsi_devinfo: Add blacklist entry for HPE OPEN-V +- Bluetooth: Add a new USB ID for RTL8822CE +- scsi: qedf: Do not put host in qedf_vport_create() unconditionally +- ethernet: myri10ge: Fix missing error code in myri10ge_probe() +- scsi: target: core: Fix warning on realtime kernels +- gfs2: Fix use-after-free in gfs2_glock_shrink_scan +- riscv: Use -mno-relax when using lld linker +- HID: gt683r: add missing MODULE_DEVICE_TABLE +- gfs2: fix a deadlock on withdraw-during-mount +- gfs2: Prevent direct-I/O write fallback errors from getting lost +- ARM: OMAP2+: Fix build warning when mmc_omap is not built +- ARM: OMAP1: Fix use of possibly uninitialized irq variable +- drm/tegra: sor: Fully initialize SOR before registration +- gpu: host1x: Split up client initalization and registration +- drm/tegra: sor: Do not leak runtime PM reference +- HID: usbhid: fix info leak in hid_submit_ctrl +- HID: Add BUS_VIRTUAL to hid_connect logging +- HID: multitouch: set Stylus suffix for Stylus-application devices, too +- HID: quirks: Add quirk for Lenovo optical mouse +- HID: hid-sensor-hub: Return error for hid_set_field() failure +- HID: hid-input: add mapping for emoji picker key +- HID: a4tech: use A4_2WHEEL_MOUSE_HACK_B8 for A4TECH NB-95 +- HID: quirks: Set INCREMENT_USAGE_ON_DUPLICATE for Saitek X65 +- net: ieee802154: fix null deref in parse dev addr +- livepatch: fix unload hook could not be excuted +- mm/memory-failure: make sure wait for page writeback in memory_failure +- iommu: sva: Fix compile error in iommu_sva_bind_group +- proc: only require mm_struct for writing +- tracing: Correct the length check which causes memory corruption +- scsi: core: Only put parent device if host state differs from SHOST_CREATED +- scsi: core: Put .shost_dev in failure path if host state changes to RUNNING +- scsi: core: Fix failure handling of scsi_add_host_with_dma() +- scsi: core: Fix error handling of scsi_host_alloc() +- NFSv4: nfs4_proc_set_acl needs to restore NFS_CAP_UIDGID_NOMAP on error. +- NFSv4: Fix second deadlock in nfs4_evict_inode() +- NFS: Fix use-after-free in nfs4_init_client() +- kvm: fix previous commit for 32-bit builds +- perf session: Correct buffer copying when peeking events +- NFSv4: Fix deadlock between nfs4_evict_inode() and nfs4_opendata_get_inode() +- NFS: Fix a potential NULL dereference in nfs_get_client() +- IB/mlx5: Fix initializing CQ fragments buffer +- KVM: x86: Ensure liveliness of nested VM-Enter fail tracepoint message +- x86/nmi_watchdog: Fix old-style NMI watchdog regression on old Intel CPUs +- sched/fair: Fix util_est UTIL_AVG_UNCHANGED handling +- sched/fair: Make sure to update tg contrib for blocked load +- sched/fair: Keep load_avg and load_sum synced +- perf: Fix data race between pin_count increment/decrement +- gpio: wcd934x: Fix shift-out-of-bounds error +- phy: ti: Fix an error code in wiz_probe() +- ASoC: meson: gx-card: fix sound-dai dt schema +- ASoC: core: Fix Null-point-dereference in fmt_single_name() +- phy: cadence: Sierra: Fix error return code in cdns_sierra_phy_probe() +- tools/bootconfig: Fix error return code in apply_xbc() +- vmlinux.lds.h: Avoid orphan section with !SMP +- ARM: cpuidle: Avoid orphan section warning +- RDMA/mlx4: Do not map the core_clock page to user space unless enabled +- RDMA/ipoib: Fix warning caused by destroying non-initial netns +- drm/msm/a6xx: avoid shadow NULL reference in failure path +- drm/msm/a6xx: update/fix CP_PROTECT initialization +- drm/msm/a6xx: fix incorrectly set uavflagprd_inv field for A650 +- drm/mcde: Fix off by 10^3 in calculation +- usb: typec: mux: Fix copy-paste mistake in typec_mux_match +- usb: dwc3: gadget: Disable gadget IRQ during pullup disable +- phy: usb: Fix misuse of IS_ENABLED +- regulator: rtmv20: Fix .set_current_limit/.get_current_limit callbacks +- regulator: bd71828: Fix .n_voltages settings +- regulator: fan53880: Fix missing n_voltages setting +- regulator: bd718x7: Fix the BUCK7 voltage setting on BD71837 +- regulator: max77620: Use device_set_of_node_from_dev() +- regulator: core: resolve supply for boot-on/always-on regulators +- usb: typec: tcpm: cancel frs hrtimer when unregister tcpm port +- usb: typec: tcpm: cancel vdm and state machine hrtimer when unregister tcpm port +- usb: fix various gadget panics on 10gbps cabling +- usb: fix various gadgets null ptr deref on 10gbps cabling. +- usb: gadget: eem: fix wrong eem header operation +- USB: serial: cp210x: fix alternate function for CP2102N QFN20 +- USB: serial: quatech2: fix control-request directions +- USB: serial: omninet: add device id for Zyxel Omni 56K Plus +- USB: serial: ftdi_sio: add NovaTech OrionMX product ID +- usb: gadget: f_fs: Ensure io_completion_wq is idle during unbind +- usb: typec: intel_pmc_mux: Add missed error check for devm_ioremap_resource() +- usb: typec: intel_pmc_mux: Put fwnode in error case during ->probe() +- usb: typec: ucsi: Clear PPM capability data in ucsi_init() error path +- usb: typec: wcove: Use LE to CPU conversion when accessing msg->header +- usb: musb: fix MUSB_QUIRK_B_DISCONNECT_99 handling +- usb: dwc3: ep0: fix NULL pointer exception +- usb: dwc3: gadget: Bail from dwc3_gadget_exit() if dwc->gadget is NULL +- usb: dwc3: meson-g12a: Disable the regulator in the error handling path of the probe +- usb: dwc3-meson-g12a: fix usb2 PHY glue init when phy0 is disabled +- usb: pd: Set PD_T_SINK_WAIT_CAP to 310ms +- usb: f_ncm: only first packet of aggregate needs to start timer +- USB: f_ncm: ncm_bitrate (speed) is unsigned +- mmc: renesas_sdhi: Fix HS400 on R-Car M3-W+ +- mmc: renesas_sdhi: abort tuning when timeout detected +- ftrace: Do not blindly read the ip address in ftrace_bug() +- cgroup1: don't allow '\n' in renaming +- btrfs: promote debugging asserts to full-fledged checks in validate_super +- btrfs: return value from btrfs_mark_extent_written() in case of error +- async_xor: check src_offs is not NULL before updating it +- staging: rtl8723bs: Fix uninitialized variables +- kvm: avoid speculation-based attacks from out-of-range memslot accesses +- KVM: X86: MMU: Use the correct inherited permissions to get shadow page +- perf/x86/intel/uncore: Fix M2M event umask for Ice Lake server +- drm: Lock pointer access in drm_master_release() +- drm: Fix use-after-free read in drm_getunique() +- Revert "ACPI: sleep: Put the FACS table after using it" +- spi: bcm2835: Fix out-of-bounds access with more than 4 slaves +- ALSA: hda/realtek: fix mute/micmute LEDs for HP ZBook Power G8 +- ALSA: hda/realtek: fix mute/micmute LEDs for HP EliteBook 840 Aero G8 +- ALSA: hda/realtek: fix mute/micmute LEDs and speaker for HP EliteBook x360 1040 G8 +- ALSA: hda/realtek: fix mute/micmute LEDs and speaker for HP Elite Dragonfly G2 +- ALSA: hda/realtek: headphone and mic don't work on an Acer laptop +- ALSA: firewire-lib: fix the context to call snd_pcm_stop_xrun() +- ALSA: seq: Fix race of snd_seq_timer_open() +- i2c: mpc: implement erratum A-004447 workaround +- i2c: mpc: Make use of i2c_recover_bus() +- spi: Cleanup on failure of initial setup +- spi: Don't have controller clean up spi device before driver unbind +- powerpc/fsl: set fsl,i2c-erratum-a004447 flag for P1010 i2c controllers +- powerpc/fsl: set fsl,i2c-erratum-a004447 flag for P2041 i2c controllers +- nvmet: fix false keep-alive timeout when a controller is torn down +- nvme-tcp: remove incorrect Kconfig dep in BLK_DEV_NVME +- bnx2x: Fix missing error code in bnx2x_iov_init_one() +- dm verity: fix require_signatures module_param permissions +- MIPS: Fix kernel hang under FUNCTION_GRAPH_TRACER and PREEMPT_TRACER +- nvme-fabrics: decode host pathing error for connect +- net: dsa: microchip: enable phy errata workaround on 9567 +- net: appletalk: cops: Fix data race in cops_probe1 +- net: macb: ensure the device is available before accessing GEMGXL control registers +- scsi: target: qla2xxx: Wait for stop_phase1 at WWN removal +- scsi: hisi_sas: Drop free_irq() of devm_request_irq() allocated irq +- scsi: vmw_pvscsi: Set correct residual data length +- scsi: bnx2fc: Return failure if io_req is already in ABTS processing +- net:sfc: fix non-freed irq in legacy irq mode +- RDS tcp loopback connection can hang +- net/qla3xxx: fix schedule while atomic in ql_sem_spinlock +- wq: handle VM suspension in stall detection +- cgroup: disable controllers at parse time +- net: mdiobus: get rid of a BUG_ON() +- netlink: disable IRQs for netlink_lock_table() +- bonding: init notify_work earlier to avoid uninitialized use +- isdn: mISDN: netjet: Fix crash in nj_probe: +- usb: chipidea: udc: assign interrupt number to USB gadget structure +- spi: sprd: Add missing MODULE_DEVICE_TABLE +- ASoC: sti-sas: add missing MODULE_DEVICE_TABLE +- vfio-ccw: Serialize FSM IDLE state with I/O completion +- vfio-ccw: Reset FSM state to IDLE inside FSM +- ASoC: Intel: bytcr_rt5640: Add quirk for the Lenovo Miix 3-830 tablet +- ASoC: Intel: bytcr_rt5640: Add quirk for the Glavey TM800A550L tablet +- usb: cdns3: Fix runtime PM imbalance on error +- net/nfc/rawsock.c: fix a permission check bug +- bpf: Forbid trampoline attach for functions with variable arguments +- spi: spi-zynq-qspi: Fix stack violation bug +- spi: Fix spi device unregister flow +- ASoC: amd: fix for pcm_read() error +- ASoC: max98088: fix ni clock divider calculation +- proc: Track /proc/$pid/attr/ opener mm_struct +- mtd: mtd_blkdevs: Initialize rq.limits.discard_granularity +- block, bfq: set next_rq to waker_bfqq->next_rq in waker injection +- bdev: Do not return EBUSY if bdev discard races with write +- powerpc/perf: Invoke per-CPU variable access with disabled interrupts +- perf annotate: Fix jump parsing for C++ code. +- perf tools: Fix arm64 build error with gcc-11 +- perf record: Fix memory leak in vDSO found using ASAN +- perf parse-events: Check if the software events array slots are populated +- perf symbol-elf: Fix memory leak by freeing sdt_note.args +- perf env: Fix memory leak of bpf_prog_info_linear member +- scsi: iscsi: Fix iSCSI cls conn state +- scsi: iscsi: Fix race condition between login and sync thread +- Revert "perf kmem: Do not pass additional arguments +- neighbour: allow NUD_NOARP entries to be forced GCed +- xen-netback: take a reference to the RX task thread +- netfilter: nf_tables: missing error reporting for not selected expressions +- i2c: qcom-geni: Suspend and resume the bus during SYSTEM_SLEEP_PM ops +- lib/lz4: explicitly support in-place decompression +- x86/kvm: Disable all PV features on crash +- x86/kvm: Disable kvmclock on all CPUs on shutdown +- x86/kvm: Teardown PV features on boot CPU as well +- KVM: arm64: Fix debug register indexing +- KVM: SVM: Truncate GPR value for DR and CR accesses in !64-bit mode +- btrfs: fix unmountable seed device after fstrim +- drm/msm/dpu: always use mdp device to scale bandwidth +- mm, hugetlb: fix simple resv_huge_pages underflow on UFFDIO_COPY +- btrfs: fix deadlock when cloning inline extents and low on available space +- btrfs: abort in rename_exchange if we fail to insert the second ref +- btrfs: fixup error handling in fixup_inode_link_counts +- btrfs: return errors from btrfs_del_csums in cleanup_ref_head +- btrfs: fix error handling in btrfs_del_csums +- btrfs: mark ordered extent and inode with error if we fail to finish +- powerpc/kprobes: Fix validation of prefixed instructions across page boundary +- x86/apic: Mark _all_ legacy interrupts when IO/APIC is missing +- drm/amdgpu: make sure we unpin the UVD BO +- drm/amdgpu: Don't query CE and UE errors +- nfc: fix NULL ptr dereference in llcp_sock_getname() after failed connect +- x86/sev: Check SME/SEV support in CPUID first +- x86/cpufeatures: Force disable X86_FEATURE_ENQCMD and remove update_pasid() +- mm/page_alloc: fix counting of free pages after take off from buddy +- mm/debug_vm_pgtable: fix alignment for pmd/pud_advanced_tests() +- ocfs2: fix data corruption by fallocate +- pid: take a reference when initializing `cad_pid` +- usb: dwc2: Fix build in periphal-only mode +- ext4: fix accessing uninit percpu counter variable with fast_commit +- ext4: fix memory leak in ext4_mb_init_backend on error path. +- ext4: fix fast commit alignment issues +- ext4: fix memory leak in ext4_fill_super +- ARM: dts: imx6q-dhcom: Add PU,VDD1P1,VDD2P5 regulators +- ARM: dts: imx6dl-yapp4: Fix RGMII connection to QCA8334 switch +- ALSA: hda: update the power_state during the direct-complete +- ALSA: hda: Fix for mute key LED for HP Pavilion 15-CK0xx +- ALSA: timer: Fix master timer notification +- gfs2: fix scheduling while atomic bug in glocks +- HID: multitouch: require Finger field to mark Win8 reports as MT +- HID: magicmouse: fix NULL-deref on disconnect +- HID: i2c-hid: Skip ELAN power-on command after reset +- net: caif: fix memory leak in cfusbl_device_notify +- net: caif: fix memory leak in caif_device_notify +- net: caif: add proper error handling +- net: caif: added cfserl_release function +- wireguard: allowedips: free empty intermediate nodes when removing single node +- wireguard: allowedips: allocate nodes in kmem_cache +- wireguard: allowedips: remove nodes in O(1) +- wireguard: allowedips: initialize list head in selftest +- wireguard: selftests: make sure rp_filter is disabled on vethc +- wireguard: selftests: remove old conntrack kconfig value +- wireguard: use synchronize_net rather than synchronize_rcu +- wireguard: peer: allocate in kmem_cache +- wireguard: do not use -O3 +- Bluetooth: use correct lock to prevent UAF of hdev object +- Bluetooth: fix the erroneous flush_work() order +- drm/amdgpu/jpeg3: add cancel_delayed_work_sync before power gate +- drm/amdgpu/jpeg2.5: add cancel_delayed_work_sync before power gate +- drm/amdgpu/vcn3: add cancel_delayed_work_sync before power gate +- io_uring: use better types for cflags +- io_uring: fix link timeout refs +- riscv: vdso: fix and clean-up Makefile +- serial: stm32: fix threaded interrupt handling +- tipc: fix unique bearer names sanity check +- tipc: add extack messages for bearer/media failure +- bus: ti-sysc: Fix flakey idling of uarts and stop using swsup_sidle_act +- ARM: dts: imx: emcon-avari: Fix nxp,pca8574 #gpio-cells +- ARM: dts: imx7d-pico: Fix the 'tuning-step' property +- ARM: dts: imx7d-meerkat96: Fix the 'tuning-step' property +- arm64: dts: freescale: sl28: var4: fix RGMII clock and voltage +- arm64: dts: zii-ultra: fix 12V_MAIN voltage +- arm64: dts: ls1028a: fix memory node +- bus: ti-sysc: Fix am335x resume hang for usb otg module +- optee: use export_uuid() to copy client UUID +- arm64: dts: ti: j7200-main: Mark Main NAVSS as dma-coherent +- ixgbe: add correct exception tracing for XDP +- ixgbe: optimize for XDP_REDIRECT in xsk path +- ice: add correct exception tracing for XDP +- ice: optimize for XDP_REDIRECT in xsk path +- ice: simplify ice_run_xdp +- i40e: add correct exception tracing for XDP +- i40e: optimize for XDP_REDIRECT in xsk path +- cxgb4: avoid link re-train during TC-MQPRIO configuration +- i2c: qcom-geni: Add shutdown callback for i2c +- ice: Allow all LLDP packets from PF to Tx +- ice: report supported and advertised autoneg using PHY capabilities +- ice: handle the VF VSI rebuild failure +- ice: Fix VFR issues for AVF drivers that expect ATQLEN cleared +- ice: Fix allowing VF to request more/less queues via virtchnl +- ipv6: Fix KASAN: slab-out-of-bounds Read in fib6_nh_flush_exceptions +- cxgb4: fix regression with HASH tc prio value update +- ixgbevf: add correct exception tracing for XDP +- igb: add correct exception tracing for XDP +- ieee802154: fix error return code in ieee802154_llsec_getparams() +- ieee802154: fix error return code in ieee802154_add_iface() +- bpf, lockdown, audit: Fix buggy SELinux lockdown permission checks +- bpf: Simplify cases in bpf_base_func_proto +- drm/i915/selftests: Fix return value check in live_breadcrumbs_smoketest() +- netfilter: nfnetlink_cthelper: hit EBUSY on updates if size mismatches +- netfilter: nft_ct: skip expectations for confirmed conntrack +- nvmet: fix freeing unallocated p2pmem +- net/mlx5: DR, Create multi-destination flow table with level less than 64 +- net/mlx5e: Check for needed capability for cvlan matching +- net/mlx5: Check firmware sync reset requested is set before trying to abort it +- net/mlx5e: Fix incompatible casting +- net/tls: Fix use-after-free after the TLS device goes down and up +- net/tls: Replace TLS_RX_SYNC_RUNNING with RCU +- net: sock: fix in-kernel mark setting +- net: dsa: tag_8021q: fix the VLAN IDs used for encoding sub-VLANs +- perf probe: Fix NULL pointer dereference in convert_variable_location() +- ACPICA: Clean up context mutex during object deletion +- nvme-rdma: fix in-casule data send for chained sgls +- mptcp: always parse mptcp options for MPC reqsk +- net/sched: act_ct: Fix ct template allocation for zone 0 +- net/sched: act_ct: Offload connections with commit action +- devlink: Correct VIRTUAL port to not have phys_port attributes +- HID: i2c-hid: fix format string mismatch +- HID: pidff: fix error return code in hid_pidff_init() +- HID: logitech-hidpp: initialize level variable +- ipvs: ignore IP_VS_SVC_F_HASHED flag when adding service +- vfio/platform: fix module_put call in error flow +- samples: vfio-mdev: fix error handing in mdpy_fb_probe() +- vfio/pci: zap_vma_ptes() needs MMU +- vfio/pci: Fix error return code in vfio_ecap_init() +- efi: cper: fix snprintf() use in cper_dimm_err_location() +- efi/libstub: prevent read overflow in find_file_option() +- efi: Allow EFI_MEMORY_XP and EFI_MEMORY_RO both to be cleared +- efi/fdt: fix panic when no valid fdt found +- netfilter: conntrack: unregister ipv4 sockopts on error unwind +- hwmon: (pmbus/isl68137) remove READ_TEMPERATURE_3 for RAA228228 +- hwmon: (dell-smm-hwmon) Fix index values +- net: usb: cdc_ncm: don't spew notifications +- btrfs: tree-checker: do not error out if extent ref hash doesn't match +- ext4: fix bug on in ext4_es_cache_extent as ext4_split_extent_at failed +- usb: core: reduce power-on-good delay time of root hub +- neighbour: Prevent Race condition in neighbour subsytem +- scripts/clang-tools: switch explicitly to Python 3 +- net: hso: bail out on interrupt URB allocation failure +- Revert "Revert "ALSA: usx2y: Fix potential NULL pointer dereference"" +- SUNRPC: More fixes for backlog congestion +- bpftool: Add sock_release help info for cgroup attach/prog load command +- net: hns3: check the return of skb_checksum_help() +- samples/bpf: Consider frame size in tx_only of xdpsock sample +- i915: fix build warning in intel_dp_get_link_status() +- net: mvpp2: add buffer header handling in RX +- net: zero-initialize tc skb extension on allocation +- MIPS: ralink: export rt_sysc_membase for rt2880_wdt.c +- MIPS: alchemy: xxs1500: add gpio-au1000.h header file +- net: hsr: fix mac_len checks +- sch_dsmark: fix a NULL deref in qdisc_reset() +- net: ethernet: mtk_eth_soc: Fix packet statistics support for MT7628/88 +- ALSA: usb-audio: scarlett2: snd_scarlett_gen2_controls_create() can be static +- ipv6: record frag_max_size in atomic fragments in input path +- net: lantiq: fix memory corruption in RX ring +- scsi: libsas: Use _safe() loop in sas_resume_port() +- ASoC: qcom: lpass-cpu: Use optional clk APIs +- ixgbe: fix large MTU request from VF +- bpf: Set mac_len in bpf_skb_change_head +- bpf, offload: Reorder offload callback 'prepare' in verifier +- ASoC: cs35l33: fix an error code in probe() +- staging: emxx_udc: fix loop in _nbu2ss_nuke() +- cxgb4: avoid accessing registers when clearing filters +- iommu/vt-d: Use user privilege for RID2PASID translation +- net: hns3: put off calling register_netdev() until client initialize complete +- net: hns3: fix incorrect resp_msg issue +- iommu/virtio: Add missing MODULE_DEVICE_TABLE +- gve: Correct SKB queue index validation. +- gve: Upgrade memory barrier in poll routine +- gve: Add NULL pointer checks when freeing irqs. +- gve: Update mgmt_msix_idx if num_ntfy changes +- gve: Check TX QPL was actually assigned +- net/smc: remove device from smcd_dev_list after failed device_add() +- mld: fix panic in mld_newpack() +- bnxt_en: Fix context memory setup for 64K page size. +- bnxt_en: Include new P5 HV definition in VF check. +- net: bnx2: Fix error return code in bnx2_init_board() +- net: hso: check for allocation failure in hso_create_bulk_serial_device() +- net: sched: fix tx action reschedule issue with stopped queue +- net: sched: fix tx action rescheduling issue during deactivation +- net: sched: fix packet stuck problem for lockless qdisc +- tls splice: check SPLICE_F_NONBLOCK instead of MSG_DONTWAIT +- openvswitch: meter: fix race when getting now_ms. +- cxgb4/ch_ktls: Clear resources when pf4 device is removed +- net: mdio: octeon: Fix some double free issues +- net: mdio: thunder: Fix a double free issue in the .remove function +- chelsio/chtls: unlock on error in chtls_pt_recvmsg() +- net: fec: fix the potential memory leak in fec_enet_init() +- net: packetmmap: fix only tx timestamp on request +- net: really orphan skbs tied to closing sk +- spi: Assume GPIO CS active high in ACPI case +- vfio-ccw: Check initialized flag in cp_init() +- net: ipa: memory region array is variable size +- net: stmmac: Fix MAC WoL not working if PHY does not support WoL +- ASoC: cs42l42: Regmap must use_single_read/write +- interconnect: qcom: Add missing MODULE_DEVICE_TABLE +- interconnect: qcom: bcm-voter: add a missing of_node_put() +- net: dsa: fix error code getting shifted with 4 in dsa_slave_get_sset_count +- net: netcp: Fix an error message +- linux/bits.h: fix compilation error with GENMASK +- block: fix a race between del_gendisk and BLKRRPART +- platform/x86: touchscreen_dmi: Add info for the Chuwi Hi10 Pro (CWI529) tablet +- drm/amdgpu: stop touching sched.ready in the backend +- drm/amd/amdgpu: fix a potential deadlock in gpu reset +- drm/amdgpu: Fix a use-after-free +- drm/amd/amdgpu: fix refcount leak +- drm/amd/display: Disconnect non-DP with no EDID +- SMB3: incorrect file id in requests compounded with open +- platform/x86: touchscreen_dmi: Add info for the Mediacom Winpad 7.0 W700 tablet +- platform/x86: intel_punit_ipc: Append MODULE_DEVICE_TABLE for ACPI +- platform/x86: hp-wireless: add AMD's hardware id to the supported list +- btrfs: do not BUG_ON in link_to_fixup_dir +- btrfs: release path before starting transaction when cloning inline extent +- scsi: pm80xx: Fix drives missing during rmmod/insmod loop +- openrisc: Define memory barrier mb +- scsi: BusLogic: Fix 64-bit system enumeration error for Buslogic +- scsi: ufs: ufs-mediatek: Fix power down spec violation +- btrfs: return whole extents in fiemap +- brcmfmac: properly check for bus register errors +- Revert "brcmfmac: add a check for the status of usb_register" +- net: liquidio: Add missing null pointer checks +- Revert "net: liquidio: fix a NULL pointer dereference" +- media: gspca: properly check for errors in po1030_probe() +- Revert "media: gspca: Check the return value of write_bridge for timeout" +- media: gspca: mt9m111: Check write_bridge for timeout +- Revert "media: gspca: mt9m111: Check write_bridge for timeout" +- media: dvb: Add check on sp8870_readreg return +- Revert "media: dvb: Add check on sp8870_readreg" +- ASoC: cs43130: handle errors in cs43130_probe() properly +- Revert "ASoC: cs43130: fix a NULL pointer dereference" +- libertas: register sysfs groups properly +- Revert "libertas: add checks for the return value of sysfs_create_group" +- dmaengine: qcom_hidma: comment platform_driver_register call +- Revert "dmaengine: qcom_hidma: Check for driver register failure" +- isdn: mISDN: correctly handle ph_info allocation failure in hfcsusb_ph_info +- Revert "isdn: mISDN: Fix potential NULL pointer dereference of kzalloc" +- ath6kl: return error code in ath6kl_wmi_set_roam_lrssi_cmd() +- Revert "ath6kl: return error code in ath6kl_wmi_set_roam_lrssi_cmd()" +- isdn: mISDNinfineon: check/cleanup ioremap failure correctly in setup_io +- Revert "isdn: mISDNinfineon: fix potential NULL pointer dereference" +- Revert "ALSA: usx2y: Fix potential NULL pointer dereference" +- Revert "ALSA: gus: add a check of the status of snd_ctl_add" +- char: hpet: add checks after calling ioremap +- Revert "char: hpet: fix a missing check of ioremap" +- net: caif: remove BUG_ON(dev == NULL) in caif_xmit +- Revert "net: caif: replace BUG_ON with recovery code" +- net/smc: properly handle workqueue allocation failure +- Revert "net/smc: fix a NULL pointer dereference" +- net: fujitsu: fix potential null-ptr-deref +- Revert "net: fujitsu: fix a potential NULL pointer dereference" +- serial: max310x: unregister uart driver in case of failure and abort +- Revert "serial: max310x: pass return value of spi_register_driver" +- Revert "ALSA: sb: fix a missing check of snd_ctl_add" +- Revert "media: usb: gspca: add a missed check for goto_low_power" +- Revert "crypto: cavium/nitrox - add an error message to explain the failure of pci_request_mem_regions" +- gpio: cadence: Add missing MODULE_DEVICE_TABLE +- platform/x86: hp_accel: Avoid invoking _INI to speed up resume +- mptcp: fix data stream corruption +- mptcp: drop unconditional pr_warn on bad opt +- mptcp: avoid error message on infinite mapping +- nvmet-tcp: fix inline data size comparison in nvmet_tcp_queue_response +- perf jevents: Fix getting maximum number of fds +- afs: Fix the nlink handling of dir-over-dir rename +- i2c: sh_mobile: Use new clock calculation formulas for RZ/G2E +- i2c: i801: Don't generate an interrupt on bus reset +- i2c: mediatek: Disable i2c start_en and clear intr_stat brfore reset +- i2c: s3c2410: fix possible NULL pointer deref on read message after write +- net: dsa: sja1105: fix VL lookup command packing for P/Q/R/S +- net: dsa: sja1105: call dsa_unregister_switch when allocating memory fails +- net: dsa: sja1105: add error handling in sja1105_setup() +- net: dsa: sja1105: error out on unsupported PHY mode +- net: dsa: sja1105: use 4095 as the private VLAN for untagged traffic +- net: dsa: sja1105: update existing VLANs from the bridge VLAN list +- net: dsa: fix a crash if ->get_sset_count() fails +- net: dsa: mt7530: fix VLAN traffic leaks +- netfilter: flowtable: Remove redundant hw refresh bit +- spi: spi-fsl-dspi: Fix a resource leak in an error handling path +- tipc: skb_linearize the head skb when reassembling msgs +- tipc: wait and exit until all work queues are done +- Revert "net:tipc: Fix a double free in tipc_sk_mcast_rcv" +- SUNRPC in case of backlog, hand free slots directly to waiting task +- net/mlx5: Set term table as an unmanaged flow table +- net/mlx4: Fix EEPROM dump support +- net/mlx5e: Fix null deref accessing lag dev +- net/mlx5: Set reformat action when needed for termination rules +- net/mlx5e: Fix nullptr in add_vlan_push_action() +- {net,vdpa}/mlx5: Configure interface MAC into mpfs L2 table +- net/mlx5e: Fix error path of updating netdev queues +- net/mlx5e: Fix multipath lag activation +- net/mlx5e: reset XPS on error flow if netdev isn't registered yet +- drm/meson: fix shutdown crash when component not probed +- NFSv4: Fix v4.0/v4.1 SEEK_DATA return -ENOTSUPP when set NFS_V4_2 config +- NFS: Don't corrupt the value of pg_bytes_written in nfs_do_recoalesce() +- NFS: Fix an Oopsable condition in __nfs_pageio_add_request() +- NFS: fix an incorrect limit in filelayout_decode_layout() +- fs/nfs: Use fatal_signal_pending instead of signal_pending +- Bluetooth: cmtp: fix file refcount when cmtp_attach_device fails +- net: usb: fix memory leak in smsc75xx_bind +- usb: typec: mux: Fix matching with typec_altmode_desc +- usb: gadget: udc: renesas_usb3: Fix a race in usb3_start_pipen() +- usb: dwc3: gadget: Properly track pending and queued SG +- thermal/drivers/intel: Initialize RW trip to THERMAL_TEMP_INVALID +- USB: serial: pl2303: add device id for ADLINK ND-6530 GC +- USB: serial: ftdi_sio: add IDs for IDS GmbH Products +- USB: serial: option: add Telit LE910-S1 compositions 0x7010, 0x7011 +- USB: serial: ti_usb_3410_5052: add startech.com device id +- serial: rp2: use 'request_firmware' instead of 'request_firmware_nowait' +- serial: sh-sci: Fix off-by-one error in FIFO threshold register setting +- serial: tegra: Fix a mask operation that is always true +- drivers: base: Fix device link removal +- USB: usbfs: Don't WARN about excessively large memory allocations +- Revert "irqbypass: do not start cons/prod when failed connect" +- USB: trancevibrator: fix control-request direction +- serial: 8250_pci: handle FL_NOIRQ board flag +- serial: 8250_pci: Add support for new HPE serial device +- serial: 8250_dw: Add device HID for new AMD UART controller +- serial: 8250: Add UART_BUG_TXRACE workaround for Aspeed VUART +- iio: adc: ad7192: handle regulator voltage error first +- iio: adc: ad7192: Avoid disabling a clock that was never enabled. +- iio: adc: ad7793: Add missing error code in ad7793_setup() +- iio: adc: ad7923: Fix undersized rx buffer. +- iio: adc: ad7124: Fix potential overflow due to non sequential channel numbers +- iio: adc: ad7124: Fix missbalanced regulator enable / disable on error. +- iio: adc: ad7768-1: Fix too small buffer passed to iio_push_to_buffers_with_timestamp() +- iio: dac: ad5770r: Put fwnode in error case during ->probe() +- iio: gyro: fxas21002c: balance runtime power in error path +- staging: iio: cdc: ad7746: avoid overwrite of num_channels +- mei: request autosuspend after sending rx flow control +- KVM: arm64: Prevent mixed-width VM creation +- KVM: X86: Fix vCPU preempted state from guest's point of view +- thunderbolt: dma_port: Fix NVM read buffer bounds and offset issue +- thunderbolt: usb4: Fix NVM read buffer bounds and offset issue +- misc/uss720: fix memory leak in uss720_probe +- serial: core: fix suspicious security_locked_down() call +- seccomp: Refactor notification handler to prepare for new semantics +- Documentation: seccomp: Fix user notification documentation +- kgdb: fix gcc-11 warnings harder +- selftests/gpio: Fix build when source tree is read only +- selftests/gpio: Move include of lib.mk up +- selftests/gpio: Use TEST_GEN_PROGS_EXTENDED +- drm/amdgpu/jpeg2.0: add cancel_delayed_work_sync before power gate +- drm/amdgpu/vcn2.5: add cancel_delayed_work_sync before power gate +- drm/amdgpu/vcn2.0: add cancel_delayed_work_sync before power gate +- drm/amdkfd: correct sienna_cichlid SDMA RLC register offset error +- drm/amdgpu/vcn1: add cancel_delayed_work_sync before power gate +- drm/amd/pm: correct MGpuFanBoost setting +- dm snapshot: properly fix a crash when an origin has no snapshots +- ath11k: Clear the fragment cache during key install +- ath10k: Validate first subframe of A-MSDU before processing the list +- ath10k: Fix TKIP Michael MIC verification for PCIe +- ath10k: drop MPDU which has discard flag set by firmware for SDIO +- ath10k: drop fragments with multicast DA for SDIO +- ath10k: drop fragments with multicast DA for PCIe +- ath10k: add CCMP PN replay protection for fragmented frames for PCIe +- mac80211: extend protection against mixed key and fragment cache attacks +- mac80211: do not accept/forward invalid EAPOL frames +- mac80211: prevent attacks on TKIP/WEP as well +- mac80211: check defrag PN against current frame +- mac80211: add fragment cache to sta_info +- mac80211: drop A-MSDUs on old ciphers +- cfg80211: mitigate A-MSDU aggregation attacks +- mac80211: properly handle A-MSDUs that start with an RFC 1042 header +- mac80211: prevent mixed key and fragment cache attacks +- mac80211: assure all fragments are encrypted +- netfilter: nft_set_pipapo_avx2: Add irq_fpu_usable() check, fallback to non-AVX2 version +- net/sched: fq_pie: fix OOB access in the traffic path +- net/sched: fq_pie: re-factor fix for fq_pie endless loop +- net: hso: fix control-request directions +- proc: Check /proc/$pid/attr/ writes against file opener +- perf scripts python: exported-sql-viewer.py: Fix warning display +- perf scripts python: exported-sql-viewer.py: Fix Array TypeError +- perf scripts python: exported-sql-viewer.py: Fix copy to clipboard from Top Calls by elapsed Time report +- perf intel-pt: Fix transaction abort handling +- perf intel-pt: Fix sample instruction bytes +- iommu/vt-d: Fix sysfs leak in alloc_iommu() +- NFSv4: Fix a NULL pointer dereference in pnfs_mark_matching_lsegs_return() +- cifs: set server->cipher_type to AES-128-CCM for SMB3.0 +- ALSA: usb-audio: scarlett2: Improve driver startup messages +- ALSA: usb-audio: scarlett2: Fix device hang with ehci-pci +- ALSA: hda/realtek: fix mute/micmute LEDs and speaker for HP Zbook Fury 17 G8 +- ALSA: hda/realtek: fix mute/micmute LEDs and speaker for HP Zbook Fury 15 G8 +- ALSA: hda/realtek: fix mute/micmute LEDs and speaker for HP Zbook G8 +- ALSA: hda/realtek: fix mute/micmute LEDs for HP 855 G8 +- ALSA: hda/realtek: Chain in pop reduction fixup for ThinkStation P340 +- ALSA: hda/realtek: Headphone volume is controlled by Front mixer +- ALSA: hda/realtek: the bass speaker can't output sound on Yoga 9i +- sched: export sched_setscheduler symbol +- arm32: kaslr: Bugfix of BSS size calculation when enabled kaslr +- mm: Move HOLES_IN_ZONE into mm +- mm,hwpoison: return -EBUSY when migration fails +- livepatch: put memory alloc and free out stop machine +- livepatch/core: Support function force patched/unpatched +- livepatch/ppc64: Enable livepatch without ftrace +- livepatch/ppc64: Sample testcase fix ppc64 +- livepatch/ppc64: Ignore the first frame when checking stack +- livepatch/ppc64: Make sure caller function in stack +- livepatch/ppc64: Use module_alloc to alloc func_node +- livepatch/ppc64: Implement per func_node livepatch trampoline +- livepatch/ppc64: Check active func in consistency stack checking +- livepatch/ppc64: Support use func_descr for new_func +- livepatch/ppc64: Implement livepatch without ftrace for ppc64be +- livepatch/ppc32: Ignore the first frame when checking stack +- livepatch/ppc32: Check active func in consistency stack checking +- livepatch/ppc32: Fix current backtracking in klp_check_calltrace +- livepatch/ppc32: Fix func size less than limit +- livepatch/ppc32: Add support for longjump +- livepatch/ppc32: Support livepatch without ftrace +- livepatch/x86: check active func in consistency stack checking +- livepatch/x86: support livepatch without ftrace +- livepatch/core: Revert module_enable_ro and module_disable_ro +- livepatch/arm: Check active func in consistency stack checking +- livepatch/arm: Add support for livepatch plt +- livepatch/arm: Fix current backtracking in klp_check_calltrace +- livepatch/arm: Support livepatch without ftrace +- livepatch/core: Add support for arm for klp relocation +- arm/module: Use plt section indices for relocations +- livepatch/core: Add livepatch consistency depends +- livepatch/arm64: check active func in consistency stack checking +- livepatch/arm64: Fix current backtracking in klp_check_calltrace +- livepatch/arm64: Fix func size less than limit +- livepatch/arm64: Support livepatch without ftrace +- livepatch/core: Support jump_label +- livepatch/core: Supprt load and unload hooks +- livepatch/core: Split livepatch consistency +- livepatch/core: Restrict livepatch patched/unpatched when plant kprobe +- livepatch/core: Allow implementation without ftrace +- DEBUG: iommu: Sanity-check of page requests +- DEBUG: iommu/arm-smmu-v3: Add SVA trace events +- TESTING: vfio: Add support for Shared Virtual Addressing +- iommu: Add group variant for SVA bind/unbind +- mm: export symbol mmput_async +- mm: export symbol find_get_task_by_vpid +- mm: export symbol mm_access +- iommu/arm-smmu-v3: Support auxiliary domains +- iommu: Use device fault trace event +- trace/iommu: Add sva trace events +- iommu: handle page response timeout +- iommu: Add a timeout parameter for PRQ response +- iommu: Introduce attach/detach_pasid_table API +- Documentation: Generalize the "pci=noats" boot parameter +- PCI: Support ats-supported device-tree property +- arm64: dts: fast models: Enable PCIe ATS for Base RevC FVP +- dt-bindings: PCI: generic: Add ats-supported property +- iommu/arm-smmu-v3: Ratelimit event dump +- iommu/arm-smmu-v3: Add support for Hardware Translation Table Update +- iommu/arm-smmu-v3: Enable broadcast TLB maintenance +- iommu/arm-smmu-v3: Add support for PRI +- PCI/ATS: Export PRI functions +- PCI/ATS: Add PRI stubs +- mm: notify remote TLBs when dirtying a PTE +- iommu/arm-smmu-v3: Add stall support for platform devices +- ACPI/IORT: Enable stall support for platform devices +- dt-bindings: document stall property for IOMMU masters +- NFC: nci: fix memory leak in nci_allocate_device +- perf unwind: Set userdata for all __report_module() paths +- perf unwind: Fix separate debug info files when using elfutils' libdw's unwinder +- KVM: x86: Defer vtime accounting 'til after IRQ handling +- context_tracking: Move guest exit vtime accounting to separate helpers +- context_tracking: Move guest exit context tracking to separate helpers +- bpf: No need to simulate speculative domain for immediates +- bpf: Fix mask direction swap upon off reg sign change +- bpf: Wrap aux data inside bpf_sanitize_info container +- mm/page_alloc: fix counting of managed_pages +- mm: page_alloc: refactor setup_per_zone_lowmem_reserve() +- dm verity: allow only one error handling mode +- Bluetooth: SMP: Fail if remote and local public keys are identical +- video: hgafb: correctly handle card detect failure during probe +- nvmet: use new ana_log_size instead the old one +- x86/boot/compressed/64: Check SEV encryption in the 32-bit boot-path +- rtc: pcf85063: fallback to parent of_node +- nvme-multipath: fix double initialization of ANA state +- x86/Xen: swap NX determination and GDT setup on BSP +- openrisc: mm/init.c: remove unused memblock_region variable in map_ram() +- drm/i915/gt: Disable HiZ Raw Stall Optimization on broken gen7 +- tty: vt: always invoke vc->vc_sw->con_resize callback +- vt: Fix character height handling with VT_RESIZEX +- vt_ioctl: Revert VT_RESIZEX parameter handling removal +- vgacon: Record video mode changes with VT_RESIZEX +- video: hgafb: fix potential NULL pointer dereference +- qlcnic: Add null check after calling netdev_alloc_skb +- leds: lp5523: check return value of lp5xx_read and jump to cleanup code +- ics932s401: fix broken handling of errors when word reading fails +- net: rtlwifi: properly check for alloc_workqueue() failure +- scsi: ufs: handle cleanup correctly on devm_reset_control_get error +- net: stmicro: handle clk_prepare() failure during init +- ethernet: sun: niu: fix missing checks of niu_pci_eeprom_read() +- Revert "niu: fix missing checks of niu_pci_eeprom_read" +- Revert "qlcnic: Avoid potential NULL pointer dereference" +- Revert "rtlwifi: fix a potential NULL pointer dereference" +- Revert "media: rcar_drif: fix a memory disclosure" +- cdrom: gdrom: initialize global variable at init time +- cdrom: gdrom: deallocate struct gdrom_unit fields in remove_gdrom +- Revert "gdrom: fix a memory leak bug" +- Revert "scsi: ufs: fix a missing check of devm_reset_control_get" +- Revert "ecryptfs: replace BUG_ON with error handling code" +- Revert "video: imsttfb: fix potential NULL pointer dereferences" +- Revert "hwmon: (lm80) fix a missing check of bus read in lm80 probe" +- Revert "leds: lp5523: fix a missing check of return value of lp55xx_read" +- Revert "net: stmicro: fix a missing check of clk_prepare" +- Revert "video: hgafb: fix potential NULL pointer dereference" +- kcsan: Fix debugfs initcall return type +- dm snapshot: fix crash with transient storage and zero chunk size +- ipc/mqueue, msg, sem: avoid relying on a stack reference past its expiry +- xen-pciback: reconfigure also from backend watch handler +- xen-pciback: redo VF placement in the virtual topology +- mmc: sdhci-pci-gli: increase 1.8V regulator wait +- powerpc/64s/syscall: Fix ptrace syscall info with scv syscalls +- powerpc/64s/syscall: Use pt_regs.trap to distinguish syscall ABI difference between sc and scv syscalls +- drm/amdgpu: update sdma golden setting for Navi12 +- drm/amdgpu: update gc golden setting for Navi12 +- drm/amdgpu: disable 3DCGCG on picasso/raven1 to avoid compute hang +- drm/amdgpu: Fix GPU TLB update error when PAGE_SIZE > AMDGPU_PAGE_SIZE +- x86/sev-es: Forward page-faults which happen during emulation +- x86/sev-es: Use __put_user()/__get_user() for data accesses +- x86/sev-es: Don't return NULL from sev_es_get_ghcb() +- x86/sev-es: Invalidate the GHCB after completing VMGEXIT +- x86/sev-es: Move sev_es_put_ghcb() in prep for follow on patch +- nvme-tcp: fix possible use-after-completion +- Revert "serial: mvebu-uart: Fix to avoid a potential NULL pointer dereference" +- rapidio: handle create_workqueue() failure +- Revert "rapidio: fix a NULL pointer dereference when create_workqueue() fails" +- uio_hv_generic: Fix a memory leak in error handling paths +- ALSA: hda/realtek: Add fixup for HP Spectre x360 15-df0xxx +- ALSA: hda/realtek: Add fixup for HP OMEN laptop +- ALSA: hda/realtek: Fix silent headphone output on ASUS UX430UA +- ALSA: hda/realtek: Add some CLOVE SSIDs of ALC293 +- ALSA: hda/realtek: reset eapd coeff to default value for alc287 +- ALSA: firewire-lib: fix check for the size of isochronous packet payload +- Revert "ALSA: sb8: add a check for request_region" +- ALSA: hda: fixup headset for ASUS GU502 laptop +- ALSA: bebob/oxfw: fix Kconfig entry for Mackie d.2 Pro +- ALSA: usb-audio: Validate MS endpoint descriptors +- ALSA: firewire-lib: fix calculation for size of IR context payload +- ALSA: dice: fix stream format at middle sampling rate for Alesis iO 26 +- ALSA: line6: Fix racy initialization of LINE6 MIDI +- ALSA: firewire-lib: fix amdtp_packet tracepoints event for packet_index field +- ALSA: intel8x0: Don't update period unless prepared +- ALSA: dice: fix stream format for TC Electronic Konnekt Live at high sampling transfer frequency +- misc: eeprom: at24: check suspend status before disable regulator +- cifs: fix memory leak in smb2_copychunk_range +- btrfs: avoid RCU stalls while running delayed iputs +- powerpc: Fix early setup to make early_ioremap() work +- locking/mutex: clear MUTEX_FLAGS if wait_list is empty due to signal +- locking/lockdep: Correct calling tracepoints +- perf/x86: Avoid touching LBR_TOS MSR for Arch LBR +- nvmet: seset ns->file when open fails +- ptrace: make ptrace() fail if the tracee changed its pid unexpectedly +- powerpc/pseries: Fix hcall tracing recursion in pv queued spinlocks +- tools/testing/selftests/exec: fix link error +- RDMA/uverbs: Fix a NULL vs IS_ERR() bug +- RDMA/mlx5: Fix query DCT via DEVX +- platform/x86: dell-smbios-wmi: Fix oops on rmmod dell_smbios +- platform/x86: intel_int0002_vgpio: Only call enable_irq_wake() when using s2idle +- platform/mellanox: mlxbf-tmfifo: Fix a memory barrier issue +- nvme-fc: clear q_live at beginning of association teardown +- nvme-tcp: rerun io_work if req_list is not empty +- nvme-loop: fix memory leak in nvme_loop_create_ctrl() +- nvmet: fix memory leak in nvmet_alloc_ctrl() +- nvmet: remove unused ctrl->cqs +- RDMA/core: Don't access cm_id after its destruction +- RDMA/mlx5: Recover from fatal event in dual port mode +- scsi: qla2xxx: Fix error return code in qla82xx_write_flash_dword() +- scsi: qedf: Add pointer checks in qedf_update_link_speed() +- scsi: ufs: core: Increase the usable queue depth +- RDMA/rxe: Clear all QP fields if creation failed +- RDMA/core: Prevent divide-by-zero error triggered by the user +- RDMA/siw: Release xarray entry +- RDMA/siw: Properly check send and receive CQ pointers +- tee: amdtee: unload TA only when its refcount becomes 0 +- openrisc: Fix a memory leak +- firmware: arm_scpi: Prevent the ternary sign expansion bug +- scripts: switch explicitly to Python 3 +- tweewide: Fix most Shebang lines +- ipv6: remove extra dev_hold() for fallback tunnels +- ip6_tunnel: sit: proper dev_{hold|put} in ndo_[un]init methods +- sit: proper dev_{hold|put} in ndo_[un]init methods +- ip6_gre: proper dev_{hold|put} in ndo_[un]init methods +- net: stmmac: Do not enable RX FIFO overflow interrupts +- lib: stackdepot: turn depot_lock spinlock to raw_spinlock +- block: reexpand iov_iter after read/write +- ALSA: hda: generic: change the DAC ctl name for LO+SPK or LO+HP +- net:CXGB4: fix leak if sk_buff is not used +- gpiolib: acpi: Add quirk to ignore EC wakeups on Dell Venue 10 Pro 5055 +- drm/amd/display: Fix two cursor duplication when using overlay +- nvmet: remove unsupported command noise +- net: hsr: check skb can contain struct hsr_ethhdr in fill_frame_info +- bridge: Fix possible races between assigning rx_handler_data and setting IFF_BRIDGE_PORT bit +- amdgpu/pm: Prevent force of DCEFCLK on NAVI10 and SIENNA_CICHLID +- scsi: target: tcmu: Return from tcmu_handle_completions() if cmd_id not found +- ceph: don't allow access to MDS-private inodes +- ceph: don't clobber i_snap_caps on non-I_NEW inode +- ceph: fix fscache invalidation +- scsi: lpfc: Fix illegal memory access on Abort IOCBs +- riscv: Workaround mcount name prior to clang-13 +- scripts/recordmcount.pl: Fix RISC-V regex for clang +- riscv: Use $(LD) instead of $(CC) to link vDSO +- platform/chrome: cros_ec_typec: Add DP mode check +- ARM: 9075/1: kernel: Fix interrupted SMC calls +- um: Disable CONFIG_GCOV with MODULES +- um: Mark all kernel symbols as local +- NFS: NFS_INO_REVAL_PAGECACHE should mark the change attribute invalid +- Input: silead - add workaround for x86 BIOS-es which bring the chip up in a stuck state +- Input: elants_i2c - do not bind to i2c-hid compatible ACPI instantiated devices +- PCI: tegra: Fix runtime PM imbalance in pex_ep_event_pex_rst_deassert() +- ACPI / hotplug / PCI: Fix reference count leak in enable_slot() +- ARM: 9066/1: ftrace: pause/unpause function graph tracer in cpu_suspend() +- dmaengine: dw-edma: Fix crash on loading/unloading driver +- PCI: thunder: Fix compile testing +- virtio_net: Do not pull payload in skb->head +- isdn: capi: fix mismatched prototypes +- cxgb4: Fix the -Wmisleading-indentation warning +- usb: sl811-hcd: improve misleading indentation +- kgdb: fix gcc-11 warning on indentation +- airo: work around stack usage warning +- drm/i915/display: fix compiler warning about array overrun +- x86/msr: Fix wr/rdmsr_safe_regs_on_cpu() prototypes +- ASoC: rsnd: check all BUSIF status when error +- nvme: do not try to reconfigure APST when the controller is not live +- ext4: fix debug format string warning +- debugfs: Make debugfs_allow RO after init +- dt-bindings: serial: 8250: Remove duplicated compatible strings +- dt-bindings: media: renesas,vin: Make resets optional on R-Car Gen1 +- i2c: mediatek: Fix send master code at more than 1MHz +- media: rkvdec: Remove of_match_ptr() +- clk: exynos7: Mark aclk_fsys1_200 as critical +- drm/i915: Fix crash in auto_retire +- drm/i915/overlay: Fix active retire callback alignment +- drm/i915: Read C0DRB3/C1DRB3 as 16 bits again +- drm/i915/gt: Fix a double free in gen8_preallocate_top_level_pdp +- kobject_uevent: remove warning in init_uevent_argv() +- usb: typec: tcpm: Fix error while calculating PPS out values +- clocksource/drivers/timer-ti-dm: Handle dra7 timer wrap errata i940 +- clocksource/drivers/timer-ti-dm: Prepare to handle dra7 timer wrap issue +- MIPS: Avoid handcoded DIVU in `__div64_32' altogether +- MIPS: Avoid DIVU in `__div64_32' is result would be zero +- MIPS: Reinstate platform `__div64_32' handler +- mm: fix struct page layout on 32-bit systems +- iommu/vt-d: Remove WO permissions on second-level paging entries +- iommu/vt-d: Preset Access/Dirty bits for IOVA over FL +- Revert "iommu/vt-d: Preset Access/Dirty bits for IOVA over FL" +- Revert "iommu/vt-d: Remove WO permissions on second-level paging entries" +- KVM: VMX: Disable preemption when probing user return MSRs +- KVM: VMX: Do not advertise RDPID if ENABLE_RDTSCP control is unsupported +- KVM: nVMX: Always make an attempt to map eVMCS after migration +- KVM: x86: Move RDPID emulation intercept to its own enum +- KVM: x86: Emulate RDPID only if RDTSCP is supported +- xen/gntdev: fix gntdev_mmap() error exit path +- cdc-wdm: untangle a circular dependency between callback and softint +- iio: tsl2583: Fix division by a zero lux_val +- iio: gyro: mpu3050: Fix reported temperature value +- xhci: Add reset resume quirk for AMD xhci controller. +- xhci: Do not use GFP_KERNEL in (potentially) atomic context +- xhci-pci: Allow host runtime PM as default for Intel Alder Lake xHCI +- usb: typec: ucsi: Put fwnode in any case during ->probe() +- usb: typec: ucsi: Retrieve all the PDOs instead of just the first 4 +- usb: dwc3: gadget: Return success always for kick transfer in ep queue +- usb: dwc3: gadget: Enable suspend events +- usb: core: hub: fix race condition about TRSMRCY of resume +- usb: dwc2: Fix gadget DMA unmap direction +- usb: xhci: Increase timeout for HC halt +- usb: dwc3: pci: Enable usb2-gadget-lpm-disable for Intel Merrifield +- usb: dwc3: omap: improve extcon initialization +- blk-mq: Swap two calls in blk_mq_exit_queue() +- blk-mq: plug request for shared sbitmap +- nbd: Fix NULL pointer in flush_workqueue +- f2fs: compress: fix to assign cc.cluster_idx correctly +- f2fs: compress: fix race condition of overwrite vs truncate +- f2fs: compress: fix to free compress page correctly +- nvmet-rdma: Fix NULL deref when SEND is completed with error +- nvmet: fix inline bio check for bdev-ns +- nvmet: add lba to sect conversion helpers +- kyber: fix out of bounds access when preempted +- ACPI: scan: Fix a memory leak in an error handling path +- usb: musb: Fix an error message +- hwmon: (occ) Fix poll rate limiting +- usb: fotg210-hcd: Fix an error message +- iio: hid-sensors: select IIO_TRIGGERED_BUFFER under HID_SENSOR_IIO_TRIGGER +- iio: proximity: pulsedlight: Fix rumtime PM imbalance on error +- iio: light: gp2ap002: Fix rumtime PM imbalance on error +- usb: dwc3: gadget: Free gadget structure only after freeing endpoints +- perf tools: Fix dynamic libbpf link +- xen/unpopulated-alloc: fix error return code in fill_list() +- xen/unpopulated-alloc: consolidate pgmap manipulation +- dax: Wake up all waiters after invalidating dax entry +- dax: Add a wakeup mode parameter to put_unlocked_entry() +- dax: Add an enum for specifying dax wakup mode +- KVM: x86: Prevent deadlock against tk_core.seq +- KVM: x86: Cancel pvclock_gtod_work on module removal +- drm/msm/dp: initialize audio_comp when audio starts +- KVM: LAPIC: Accurately guarantee busy wait for timer to expire when using hv_timer +- kvm: exit halt polling on need_resched() as well +- drm/i915: Avoid div-by-zero on gen2 +- drm/amd/display: Initialize attribute for hdcp_srm sysfs file +- drm/radeon/dpm: Disable sclk switching on Oland when two 4K 60Hz monitors are connected +- btrfs: fix race leading to unpersisted data and metadata on fsync +- arm64: Fix race condition on PG_dcache_clean in __sync_icache_dcache() +- arm64: mte: initialize RGSR_EL1.SEED in __cpu_setup +- blk-iocost: fix weight updates of inner active iocgs +- mm/hugetlb: fix F_SEAL_FUTURE_WRITE +- kasan: fix unit tests with CONFIG_UBSAN_LOCAL_BOUNDS enabled +- userfaultfd: release page in error path to avoid BUG_ON +- squashfs: fix divide error in calculate_skip() +- hfsplus: prevent corruption in shrinking truncate +- powerpc/64s: Fix crashes when toggling entry flush barrier +- powerpc/64s: Fix crashes when toggling stf barrier +- ARC: mm: Use max_high_pfn as a HIGHMEM zone border +- ARC: mm: PAE: use 40-bit physical page mask +- ARC: entry: fix off-by-one error in syscall number validation +- f2fs: avoid unneeded data copy in f2fs_ioc_move_range() +- mptcp: fix splat when closing unaccepted socket +- i40e: Fix PHY type identifiers for 2.5G and 5G adapters +- i40e: fix the restart auto-negotiation after FEC modified +- i40e: Fix use-after-free in i40e_client_subtask() +- i40e: fix broken XDP support +- netfilter: nftables: avoid overflows in nft_hash_buckets() +- kernel/resource: make walk_mem_res() find all busy IORESOURCE_MEM resources +- kernel/resource: make walk_system_ram_res() find all busy IORESOURCE_SYSTEM_RAM resources +- kernel: kexec_file: fix error return code of kexec_calculate_store_digests() +- fs/proc/generic.c: fix incorrect pde_is_permanent check +- sched/fair: Fix unfairness caused by missing load decay +- sched: Fix out-of-bound access in uclamp +- can: m_can: m_can_tx_work_queue(): fix tx_skb race condition +- can: mcp251x: fix resume from sleep before interface was brought up +- can: mcp251xfd: mcp251xfd_probe(): add missing can_rx_offload_del() in error path +- netfilter: nftables: Fix a memleak from userdata error path in new objects +- netfilter: nfnetlink_osf: Fix a missing skb_header_pointer() NULL check +- smc: disallow TCP_ULP in smc_setsockopt() +- net: fix nla_strcmp to handle more then one trailing null character +- ethtool: fix missing NLM_F_MULTI flag when dumping +- mm/gup: check for isolation errors +- mm/gup: return an error on migration failure +- mm/gup: check every subpage of a compound page during isolation +- ksm: fix potential missing rmap_item for stable_node +- mm/migrate.c: fix potential indeterminate pte entry in migrate_vma_insert_page() +- mm/hugeltb: handle the error case in hugetlb_fix_reserve_counts() +- khugepaged: fix wrong result value for trace_mm_collapse_huge_page_isolate() +- arm64: entry: always set GIC_PRIO_PSR_I_SET during entry +- arm64: entry: factor irq triage logic into macros +- drm/radeon: Avoid power table parsing memory leaks +- drm/radeon: Fix off-by-one power_state index heap overwrite +- net: stmmac: Clear receive all(RA) bit when promiscuous mode is off +- xsk: Fix for xp_aligned_validate_desc() when len == chunk_size +- netfilter: xt_SECMARK: add new revision to fix structure layout +- sctp: fix a SCTP_MIB_CURRESTAB leak in sctp_sf_do_dupcook_b +- ethernet:enic: Fix a use after free bug in enic_hard_start_xmit +- block/rnbd-clt: Check the return value of the function rtrs_clt_query +- block/rnbd-clt: Change queue_depth type in rnbd_clt_session to size_t +- libbpf: Fix signed overflow in ringbuf_process_ring +- sunrpc: Fix misplaced barrier in call_decode +- RISC-V: Fix error code returned by riscv_hartid_to_cpuid() +- sctp: do asoc update earlier in sctp_sf_do_dupcook_a +- net: hns3: disable phy loopback setting in hclge_mac_start_phy +- net: hns3: use netif_tx_disable to stop the transmit queue +- net: hns3: fix for vxlan gpe tx checksum bug +- net: hns3: add check for HNS3_NIC_STATE_INITED in hns3_reset_notify_up_enet() +- net: hns3: initialize the message content in hclge_get_link_mode() +- net: hns3: fix incorrect configuration for igu_egu_hw_err +- rtc: ds1307: Fix wday settings for rx8130 +- scsi: ufs: core: Narrow down fast path in system suspend path +- scsi: ufs: core: Cancel rpm_dev_flush_recheck_work during system suspend +- scsi: ufs: core: Do not put UFS power into LPM if link is broken +- scsi: qla2xxx: Prevent PRLI in target mode +- ceph: fix inode leak on getattr error in __fh_to_dentry +- swiotlb: Fix the type of index +- xprtrdma: rpcrdma_mr_pop() already does list_del_init() +- xprtrdma: Fix cwnd update ordering +- xprtrdma: Avoid Receive Queue wrapping +- pwm: atmel: Fix duty cycle calculation in .get_state() +- SUNRPC: fix ternary sign expansion bug in tracing +- dmaengine: idxd: fix cdev setup and free device lifetime issues +- dmaengine: idxd: fix dma device lifetime +- dmaengine: idxd: Fix potential null dereference on pointer status +- rtc: fsl-ftm-alarm: add MODULE_TABLE() +- nfsd: ensure new clients break delegations +- NFSv4.x: Don't return NFS4ERR_NOMATCHING_LAYOUT if we're unmounting +- thermal/drivers/tsens: Fix missing put_device error +- SUNRPC: Handle major timeout in xprt_adjust_timeout() +- SUNRPC: Remove trace_xprt_transmit_queued +- SUNRPC: Move fault injection call sites +- NFSv4.2 fix handling of sr_eof in SEEK's reply +- pNFS/flexfiles: fix incorrect size check in decode_nfs_fh() +- PCI: endpoint: Fix missing destroy_workqueue() +- NFS: Deal correctly with attribute generation counter overflow +- NFSv4.2: Always flush out writes in nfs42_proc_fallocate() +- NFS: Fix attribute bitmask in _nfs42_proc_fallocate() +- NFS: nfs4_bitmask_adjust() must not change the server global bitmasks +- rpmsg: qcom_glink_native: fix error return code of qcom_glink_rx_data() +- f2fs: fix to avoid accessing invalid fio in f2fs_allocate_data_block() +- f2fs: Fix a hungtask problem in atomic write +- f2fs: fix to cover __allocate_new_section() with curseg_lock +- f2fs: fix to avoid touching checkpointed data in get_victim() +- PCI: endpoint: Fix NULL pointer dereference for ->get_features() +- PCI: endpoint: Make *_free_bar() to return error codes on failure +- PCI: endpoint: Add helper API to get the 'next' unreserved BAR +- PCI: endpoint: Make *_get_first_free_bar() take into account 64 bit BAR +- f2fs: fix to update last i_size if fallocate partially succeeds +- f2fs: fix to align to section for fallocate() on pinned file +- PCI: Release OF node in pci_scan_device()'s error path +- PCI: iproc: Fix return value of iproc_msi_irq_domain_alloc() +- remoteproc: qcom_q6v5_mss: Validate p_filesz in ELF loader +- remoteproc: qcom_q6v5_mss: Replace ioremap with memremap +- f2fs: fix a redundant call to f2fs_balance_fs if an error occurs +- f2fs: fix panic during f2fs_resize_fs() +- f2fs: fix to allow migrating fully valid segment +- f2fs: fix compat F2FS_IOC_{MOVE,GARBAGE_COLLECT}_RANGE +- f2fs: move ioctl interface definitions to separated file +- thermal: thermal_of: Fix error return code of thermal_of_populate_bind_params() +- ASoC: rt286: Make RT286_SET_GPIO_* readable and writable +- watchdog: fix barriers when printing backtraces from all CPUs +- watchdog/softlockup: remove logic that tried to prevent repeated reports +- watchdog: explicitly update timestamp when reporting softlockup +- watchdog: rename __touch_watchdog() to a better descriptive name +- ia64: module: fix symbolizer crash on fdescr +- bnxt_en: Add PCI IDs for Hyper-V VF devices. +- kbuild: generate Module.symvers only when vmlinux exists +- selftests: mlxsw: Fix mausezahn invocation in ERSPAN scale test +- selftests: mlxsw: Increase the tolerance of backlog buildup +- net: ethernet: mtk_eth_soc: fix RX VLAN offload +- iavf: remove duplicate free resources calls +- powerpc/iommu: Annotate nested lock for lockdep +- qtnfmac: Fix possible buffer overflow in qtnf_event_handle_external_auth +- wl3501_cs: Fix out-of-bounds warnings in wl3501_mgmt_join +- wl3501_cs: Fix out-of-bounds warnings in wl3501_send_pkt +- crypto: ccp: Free SEV device if SEV init fails +- mt76: mt7615: fix entering driver-own state on mt7663 +- drm/amdgpu: Add mem sync flag for IB allocated by SA +- drm/amd/display: add handling for hdcp2 rx id list validation +- drm/amd/display: fixed divide by zero kernel crash during dsc enablement +- powerpc/pseries: Stop calling printk in rtas_stop_self() +- samples/bpf: Fix broken tracex1 due to kprobe argument change +- net: sched: tapr: prevent cycle_time == 0 in parse_taprio_schedule +- ethtool: ioctl: Fix out-of-bounds warning in store_link_ksettings_for_user() +- ASoC: rt286: Generalize support for ALC3263 codec +- powerpc/smp: Set numa node before updating mask +- flow_dissector: Fix out-of-bounds warning in __skb_flow_bpf_to_target() +- sctp: Fix out-of-bounds warning in sctp_process_asconf_param() +- ALSA: hda/hdmi: fix race in handling acomp ELD notification at resume +- ASoC: Intel: sof_sdw: add quirk for new ADL-P Rvp +- ALSA: hda/realtek: Add quirk for Lenovo Ideapad S740 +- kconfig: nconf: stop endless search loops +- selftests: Set CC to clang in lib.mk if LLVM is set +- drm/amd/display: Force vsync flip when reconfiguring MPCC +- iommu/amd: Remove performance counter pre-initialization test +- Revert "iommu/amd: Fix performance counter initialization" +- ASoC: rsnd: call rsnd_ssi_master_clk_start() from rsnd_ssi_init() +- powerpc/mm: Add cond_resched() while removing hpte mappings +- iwlwifi: pcie: make cfg vs. trans_cfg more robust +- cuse: prevent clone +- virtiofs: fix userns +- fuse: invalidate attrs when page writeback completes +- mt76: mt7915: fix txpower init for TSSI off chips +- mt76: mt76x0: disable GTK offloading +- mt76: mt7615: support loading EEPROM for MT7613BE +- rtw88: 8822c: add LC calibration for RTL8822C +- pinctrl: samsung: use 'int' for register masks in Exynos +- mac80211: clear the beacon's CRC after channel switch +- IB/hfi1: Correct oversized ring allocation +- coresight: Do not scan for graph if none is present +- MIPS: Loongson64: Use _CACHE_UNCACHED instead of _CACHE_UNCACHED_ACCELERATED +- i2c: Add I2C_AQ_NO_REP_START adapter quirk +- ASoC: rt5670: Add a quirk for the Dell Venue 10 Pro 5055 +- Bluetooth: btusb: Enable quirk boolean flag for Mediatek Chip. +- ice: handle increasing Tx or Rx ring sizes +- ASoC: Intel: bytcr_rt5640: Add quirk for the Chuwi Hi8 tablet +- ip6_vti: proper dev_{hold|put} in ndo_[un]init methods +- net: hns3: add handling for xmit skb with recursive fraglist +- net: hns3: remediate a potential overflow risk of bd_num_list +- powerpc/32: Statically initialise first emergency context +- selftests/powerpc: Fix L1D flushing tests for Power10 +- Bluetooth: check for zapped sk before connecting +- net: bridge: when suppression is enabled exclude RARP packets +- net/sched: cls_flower: use ntohs for struct flow_dissector_key_ports +- Bluetooth: initialize skb_queue_head at l2cap_chan_create() +- Bluetooth: Set CONF_NOT_COMPLETE as l2cap_chan default +- ALSA: bebob: enable to deliver MIDI messages for multiple ports +- ALSA: rme9652: don't disable if not enabled +- ALSA: hdspm: don't disable if not enabled +- ALSA: hdsp: don't disable if not enabled +- i2c: bail out early when RDWR parameters are wrong +- Bluetooth: Fix incorrect status handling in LE PHY UPDATE event +- ASoC: rsnd: core: Check convert rate in rsnd_hw_params +- net: stmmac: Set FIFO sizes for ipq806x +- net/mlx5e: Use net_prefetchw instead of prefetchw in MPWQE TX datapath +- ASoC: Intel: bytcr_rt5640: Enable jack-detect support on Asus T100TAF +- tipc: convert dest node's address to network order +- fs: dlm: flush swork on shutdown +- fs: dlm: check on minimum msglen size +- fs: dlm: add errno handling to check callback +- fs: dlm: fix debugfs dump +- ath11k: fix thermal temperature read +- kvm: Cap halt polling at kvm->max_halt_poll_ns +- cpufreq: intel_pstate: Use HWP if enabled by platform firmware +- PM: runtime: Fix unpaired parent child_count for force_resume +- ACPI: PM: Add ACPI ID of Alder Lake Fan +- KVM/VMX: Invoke NMI non-IST entry instead of IST entry +- KVM: x86/mmu: Remove the defunct update_pte() paging hook +- tpm, tpm_tis: Reserve locality in tpm_tis_resume() +- tpm, tpm_tis: Extend locality handling to TPM2 in tpm_tis_gen_interrupt() +- tpm: fix error return code in tpm2_get_cc_attrs_tbl() +- KEYS: trusted: Fix memory leak on object td +- sctp: delay auto_asconf init until binding the first addr +- Revert "net/sctp: fix race condition in sctp_destroy_sock" +- smp: Fix smp_call_function_single_async prototype +- net: Only allow init netns to set default tcp cong to a restricted algo +- bpf: Prevent writable memory-mapping of read-only ringbuf pages +- bpf, ringbuf: Deny reserve of buffers larger than ringbuf +- bpf: Fix alu32 const subreg bound tracking on bitwise operations +- afs: Fix speculative status fetches +- mm/memory-failure: unnecessary amount of unmapping +- mm/sparse: add the missing sparse_buffer_fini() in error branch +- mm: memcontrol: slab: fix obtain a reference to a freeing memcg +- mm/sl?b.c: remove ctor argument from kmem_cache_flags +- kfifo: fix ternary sign extension bugs +- ia64: fix EFI_DEBUG build +- perf session: Add swap operation for event TIME_CONV +- perf jit: Let convert_timestamp() to be backwards-compatible +- perf tools: Change fields type in perf_record_time_conv +- net:nfc:digital: Fix a double free in digital_tg_recv_dep_req +- net: bridge: mcast: fix broken length + header check for MRDv6 Adv. +- RDMA/bnxt_re: Fix a double free in bnxt_qplib_alloc_res +- RDMA/siw: Fix a use after free in siw_alloc_mr +- bpf: Fix propagation of 32 bit unsigned bounds from 64 bit bounds +- selftests/bpf: Fix core_reloc test runner +- selftests/bpf: Fix field existence CO-RE reloc tests +- selftests/bpf: Fix BPF_CORE_READ_BITFIELD() macro +- net:emac/emac-mac: Fix a use after free in emac_mac_tx_buf_send +- KVM: VMX: Intercept FS/GS_BASE MSR accesses for 32-bit KVM +- bnxt_en: Fix RX consumer index logic in the error path. +- selftests: mlxsw: Remove a redundant if statement in tc_flower_scale test +- selftests: net: mirror_gre_vlan_bridge_1q: Make an FDB entry static +- net: geneve: modify IP header check in geneve6_xmit_skb and geneve_xmit_skb +- arm64: dts: uniphier: Change phy-mode to RGMII-ID to enable delay pins for RTL8211E +- ARM: dts: uniphier: Change phy-mode to RGMII-ID to enable delay pins for RTL8211E +- bnxt_en: fix ternary sign extension bug in bnxt_show_temp() +- net: enetc: fix link error again +- net: phy: marvell: fix m88e1111_set_downshift +- net: phy: marvell: fix m88e1011_set_downshift +- powerpc/52xx: Fix an invalid ASM expression ('addi' used instead of 'add') +- powerpc/perf: Fix the threshold event selection for memory events in power10 +- wlcore: Fix buffer overrun by snprintf due to incorrect buffer size +- ath10k: Fix ath10k_wmi_tlv_op_pull_peer_stats_info() unlock without lock +- ath10k: Fix a use after free in ath10k_htc_send_bundle +- ath9k: Fix error check in ath9k_hw_read_revisions() for PCI devices +- powerpc/64: Fix the definition of the fixmap area +- RDMA/core: Add CM to restrack after successful attachment to a device +- RDMA/rxe: Fix a bug in rxe_fill_ip_info() +- net: phy: intel-xway: enable integrated led functions +- net: renesas: ravb: Fix a stuck issue when a lot of frames are received +- net: stmmac: fix TSO and TBS feature enabling during driver open +- nfp: devlink: initialize the devlink port attribute "lanes" +- crypto: ccp: Detect and reject "invalid" addresses destined for PSP +- mt76: mt7615: fix memleak when mt7615_unregister_device() +- net: davinci_emac: Fix incorrect masking of tx and rx error channel +- net: marvell: prestera: fix port event handling on init +- vsock/virtio: free queued packets when closing socket +- sfc: ef10: fix TX queue lookup in TX event handling +- ALSA: usb: midi: don't return -ENOMEM when usb_urb_ep_type_check fails +- RDMA/i40iw: Fix error unwinding when i40iw_hmc_sd_one fails +- RDMA/cxgb4: add missing qpid increment +- gro: fix napi_gro_frags() Fast GRO breakage due to IP alignment check +- net: ethernet: ixp4xx: Set the DMA masks explicitly +- libbpf: Initialize the bpf_seq_printf parameters array field by field +- vsock/vmci: log once the failed queue pair allocation +- netfilter: nftables_offload: special ethertype handling for VLAN +- netfilter: nftables_offload: VLAN id needs host byteorder in flow dissector +- netfilter: nft_payload: fix C-VLAN offload support +- mwl8k: Fix a double Free in mwl8k_probe_hw +- i2c: mediatek: Fix wrong dma sync flag +- i2c: sh7760: fix IRQ error path +- wlcore: fix overlapping snprintf arguments in debugfs +- rtlwifi: 8821ae: upgrade PHY and RF parameters +- KVM: x86: dump_vmcs should not assume GUEST_IA32_EFER is valid +- powerpc/smp: Reintroduce cpu_core_mask +- powerpc/pseries: extract host bridge from pci_bus prior to bus removal +- MIPS: pci-legacy: stop using of_pci_range_to_resource +- drm/amd/pm: fix error code in smu_set_power_limit() +- perf beauty: Fix fsconfig generator +- iommu/amd: Put newline after closing bracket in warning +- drm/i915/gvt: Fix error code in intel_gvt_init_device() +- net/packet: remove data races in fanout operations +- net/packet: make packet_fanout.arr size configurable up to 64K +- net/mlx5: Fix bit-wise and with zero +- ASoC: ak5558: correct reset polarity +- powerpc/xive: Fix xmon command "dxi" +- powerpc/xive: Drop check on irq_data in xive_core_debug_show() +- i2c: sh7760: add IRQ check +- i2c: rcar: add IRQ check +- i2c: rcar: protect against supurious interrupts on V3U +- i2c: rcar: make sure irq is not threaded on Gen2 and earlier +- i2c: mlxbf: add IRQ check +- i2c: jz4780: add IRQ check +- i2c: emev2: add IRQ check +- i2c: cadence: add IRQ check +- i2c: xiic: fix reference leak when pm_runtime_get_sync fails +- i2c: stm32f7: fix reference leak when pm_runtime_get_sync fails +- i2c: sprd: fix reference leak when pm_runtime_get_sync fails +- i2c: omap: fix reference leak when pm_runtime_get_sync fails +- i2c: imx: fix reference leak when pm_runtime_get_sync fails +- i2c: imx-lpi2c: fix reference leak when pm_runtime_get_sync fails +- i2c: img-scb: fix reference leak when pm_runtime_get_sync fails +- i2c: cadence: fix reference leak when pm_runtime_get_sync fails +- RDMA/rtrs-clt: destroy sysfs after removing session from active list +- RDMA/srpt: Fix error return code in srpt_cm_req_recv() +- net: thunderx: Fix unintentional sign extension issue +- cxgb4: Fix unintentional sign extension issues +- RDMA/bnxt_re: Fix error return code in bnxt_qplib_cq_process_terminal() +- IB/hfi1: Fix error return code in parse_platform_config() +- RDMA/qedr: Fix error return code in qedr_iw_connect() +- ovl: invalidate readdir cache on changes to dir with origin +- KVM: PPC: Book3S HV P9: Restore host CTRL SPR after guest exit +- mt76: mt7663s: fix the possible device hang in high traffic +- mt76: mt7663s: make all of packets 4-bytes aligned in sdio tx aggregation +- mt76: mt7915: fix mib stats counter reporting to mac80211 +- mt76: mt7615: fix mib stats counter reporting to mac80211 +- mt76: mt7915: fix aggr len debugfs node +- mt76: mt7915: fix tx skb dma unmap +- mt76: mt7615: fix tx skb dma unmap +- mt7601u: fix always true expression +- rtw88: Fix an error code in rtw_debugfs_set_rsvd_page() +- xfs: fix return of uninitialized value in variable error +- perf vendor events amd: Fix broken L2 Cache Hits from L2 HWPF metric +- mac80211: bail out if cipher schemes are invalid +- powerpc: iommu: fix build when neither PCI or IBMVIO is set +- powerpc/perf: Fix PMU constraint check for EBB events +- powerpc/64s: Fix pte update for kernel memory on radix +- IB/hfi1: Use kzalloc() for mmu_rb_handler allocation +- liquidio: Fix unintented sign extension of a left shift of a u16 +- ASoC: simple-card: fix possible uninitialized single_cpu local variable +- KVM: arm64: Initialize VCPU mdcr_el2 before loading it +- HID: lenovo: Map mic-mute button to KEY_F20 instead of KEY_MICMUTE +- HID: lenovo: Check hid_get_drvdata() returns non NULL in lenovo_event() +- HID: lenovo: Fix lenovo_led_set_tp10ubkbd() error handling +- HID: lenovo: Use brightness_set_blocking callback for setting LEDs brightness +- ALSA: usb-audio: Add error checks for usb_driver_claim_interface() calls +- iommu/vt-d: Invalidate PASID cache when root/context entry changed +- iommu/vt-d: Remove WO permissions on second-level paging entries +- iommu/vt-d: Preset Access/Dirty bits for IOVA over FL +- iommu/vt-d: Report the right page fault address +- iommu/vt-d: Report right snoop capability when using FL for IOVA +- iommu: Fix a boundary issue to avoid performance drop +- iommu/vt-d: Don't set then clear private data in prq_event_thread() +- mips: bmips: fix syscon-reboot nodes +- net: hns3: Limiting the scope of vector_ring_chain variable +- nfc: pn533: prevent potential memory corruption +- RDMA/core: Fix corrupted SL on passive side +- bug: Remove redundant condition check in report_bug +- net/tipc: fix missing destroy_workqueue() on error in tipc_crypto_start() +- powerpc/pseries: Only register vio drivers if vio bus exists +- udp: never accept GSO_FRAGLIST packets +- net: phy: lan87xx: fix access to wrong register of LAN87xx +- ALSA: core: remove redundant spin_lock pair in snd_card_disconnect +- gpio: guard gpiochip_irqchip_add_domain() with GPIOLIB_IRQCHIP +- MIPS/bpf: Enable bpf_probe_read{, str}() on MIPS again +- powerpc: Fix HAVE_HARDLOCKUP_DETECTOR_ARCH build configuration +- IB/isert: Fix a use after free in isert_connect_request +- RDMA/mlx5: Fix drop packet rule in egress table +- iommu/arm-smmu-v3: add bit field SFM into GERROR_ERR_MASK +- ASoC: wm8960: Remove bitclk relax condition in wm8960_configure_sysclk +- MIPS: loongson64: fix bug when PAGE_SIZE > 16KB +- pinctrl: pinctrl-single: fix pcs_pin_dbg_show() when bits_per_mux is not zero +- pinctrl: pinctrl-single: remove unused parameter +- inet: use bigger hash table for IP ID generation +- ima: Fix the error code for restoring the PCR value +- MIPS: fix local_irq_{disable,enable} in asmmacro.h +- powerpc/prom: Mark identical_pvr_fixup as __init +- powerpc/fadump: Mark fadump_calculate_reserve_size as __init +- libbpf: Add explicit padding to btf_dump_emit_type_decl_opts +- selftests/bpf: Re-generate vmlinux.h and BPF skeletons if bpftool changed +- iommu/vt-d: Reject unsupported page request modes +- iommu: Check dev->iommu in iommu_dev_xxx functions +- bpftool: Fix maybe-uninitialized warnings +- libbpf: Add explicit padding to bpf_xdp_set_link_opts +- net: lapbether: Prevent racing when checking whether the netif is running +- Bluetooth: avoid deadlock between hci_dev->lock and socket lock +- KVM: x86/mmu: Retry page faults that hit an invalid memslot +- wilc1000: write value to WILC_INTR2_ENABLE register +- RDMA/mlx5: Fix mlx5 rates to IB rates map +- ASoC: Intel: Skylake: Compile when any configuration is selected +- ASoC: Intel: boards: sof-wm8804: add check for PLL setting +- perf symbols: Fix dso__fprintf_symbols_by_name() to return the number of printed chars +- HID: plantronics: Workaround for double volume key presses +- xsk: Respect device's headroom and tailroom on generic xmit path +- drivers/block/null_blk/main: Fix a double free in null_init. +- sched/debug: Fix cgroup_path[] serialization +- io_uring: fix overflows checks in provide buffers +- perf/amd/uncore: Fix sysfs type mismatch +- x86/events/amd/iommu: Fix sysfs type mismatch +- HSI: core: fix resource leaks in hsi_add_client_from_dt() +- media: cedrus: Fix H265 status definitions +- nvme-pci: don't simple map sgl when sgls are disabled +- nvmet-tcp: fix a segmentation fault during io parsing error +- mfd: stm32-timers: Avoid clearing auto reload register +- mailbox: sprd: Introduce refcnt when clients requests/free channels +- scsi: ibmvfc: Fix invalid state machine BUG_ON() +- scsi: sni_53c710: Add IRQ check +- scsi: sun3x_esp: Add IRQ check +- scsi: jazz_esp: Add IRQ check +- scsi: hisi_sas: Fix IRQ checks +- scsi: ufs: ufshcd-pltfrm: Fix deferred probing +- scsi: pm80xx: Fix potential infinite loop +- scsi: pm80xx: Increase timeout for pm80xx mpi_uninit_check() +- clk: uniphier: Fix potential infinite loop +- drm/radeon: Fix a missing check bug in radeon_dp_mst_detect() +- drm/amd/display: use GFP_ATOMIC in dcn20_resource_construct +- clk: qcom: apss-ipq-pll: Add missing MODULE_DEVICE_TABLE +- clk: qcom: a53-pll: Add missing MODULE_DEVICE_TABLE +- drm: xlnx: zynqmp: fix a memset in zynqmp_dp_train() +- clk: zynqmp: pll: add set_pll_mode to check condition in zynqmp_pll_enable +- clk: zynqmp: move zynqmp_pll_set_mode out of round_rate callback +- vfio/mdev: Do not allow a mdev_type to have a NULL parent pointer +- vfio/pci: Re-order vfio_pci_probe() +- vfio/pci: Move VGA and VF initialization to functions +- vfio/fsl-mc: Re-order vfio_fsl_mc_probe() +- media: v4l2-ctrls.c: fix race condition in hdl->requests list +- media: i2c: imx219: Balance runtime PM use-count +- media: i2c: imx219: Move out locking/unlocking of vflip and hflip controls from imx219_set_stream +- nvme: retrigger ANA log update if group descriptor isn't found +- power: supply: bq25980: Move props from battery node +- clk: imx: Fix reparenting of UARTs not associated with stdout +- nvmet-tcp: fix incorrect locking in state_change sk callback +- nvme-tcp: block BH in sk state_change sk callback +- seccomp: Fix CONFIG tests for Seccomp_filters +- ata: libahci_platform: fix IRQ check +- sata_mv: add IRQ checks +- pata_ipx4xx_cf: fix IRQ check +- pata_arasan_cf: fix IRQ check +- selftests: fix prepending $(OUTPUT) to $(TEST_PROGS) +- x86/kprobes: Fix to check non boostable prefixes correctly +- of: overlay: fix for_each_child.cocci warnings +- drm/amdkfd: fix build error with AMD_IOMMU_V2=m +- media: atomisp: Fix use after free in atomisp_alloc_css_stat_bufs() +- media: m88rs6000t: avoid potential out-of-bounds reads on arrays +- media: atomisp: Fixed error handling path +- media: [next] staging: media: atomisp: fix memory leak of object flash +- media: docs: Fix data organization of MEDIA_BUS_FMT_RGB101010_1X30 +- media: m88ds3103: fix return value check in m88ds3103_probe() +- media: platform: sunxi: sun6i-csi: fix error return code of sun6i_video_start_streaming() +- media: venus: core: Fix some resource leaks in the error path of 'venus_probe()' +- drm/probe-helper: Check epoch counter in output_poll_execute() +- media: aspeed: fix clock handling logic +- media: rkisp1: rsz: crash fix when setting src format +- media: omap4iss: return error code when omap4iss_get() failed +- media: saa7146: use sg_dma_len when building pgtable +- media: saa7134: use sg_dma_len when building pgtable +- media: vivid: fix assignment of dev->fbuf_out_flags +- rcu: Remove spurious instrumentation_end() in rcu_nmi_enter() +- afs: Fix updating of i_mode due to 3rd party change +- sched/fair: Fix shift-out-of-bounds in load_balance() +- drm/mcde/panel: Inverse misunderstood flag +- drm/amd/display: Fix off by one in hdmi_14_process_transaction() +- drm/stm: Fix bus_flags handling +- drm/tilcdc: send vblank event when disabling crtc +- soc: aspeed: fix a ternary sign expansion bug +- xen-blkback: fix compatibility bug with single page rings +- serial: omap: fix rs485 half-duplex filtering +- serial: omap: don't disable rs485 if rts gpio is missing +- ttyprintk: Add TTY hangup callback. +- usb: dwc2: Fix hibernation between host and device modes. +- usb: dwc2: Fix host mode hibernation exit with remote wakeup flow. +- PM: hibernate: x86: Use crc32 instead of md5 for hibernation e820 integrity check +- Drivers: hv: vmbus: Increase wait time for VMbus unload +- hwmon: (pmbus/pxe1610) don't bail out when not all pages are active +- x86/platform/uv: Fix !KEXEC build failure +- spi: spi-zynqmp-gqspi: return -ENOMEM if dma_map_single fails +- spi: spi-zynqmp-gqspi: fix use-after-free in zynqmp_qspi_exec_op +- spi: spi-zynqmp-gqspi: fix hang issue when suspend/resume +- spi: spi-zynqmp-gqspi: fix clk_enable/disable imbalance issue +- Drivers: hv: vmbus: Use after free in __vmbus_open() +- ARM: dts: aspeed: Rainier: Fix humidity sensor bus address +- platform/x86: pmc_atom: Match all Beckhoff Automation baytrail boards with critclk_systems DMI table +- security: keys: trusted: fix TPM2 authorizations +- memory: samsung: exynos5422-dmc: handle clk_set_parent() failure +- memory: renesas-rpc-if: fix possible NULL pointer dereference of resource +- spi: spi-zynqmp-gqspi: Fix missing unlock on error in zynqmp_qspi_exec_op() +- m68k: Add missing mmap_read_lock() to sys_cacheflush() +- usbip: vudc: fix missing unlock on error in usbip_sockfd_store() +- crypto: chelsio - Read rxchannel-id from firmware +- node: fix device cleanups in error handling code +- firmware: qcom-scm: Fix QCOM_SCM configuration +- serial: core: return early on unsupported ioctls +- tty: fix return value for unsupported termiox ioctls +- tty: Remove dead termiox code +- tty: fix return value for unsupported ioctls +- tty: actually undefine superseded ASYNC flags +- USB: cdc-acm: fix TIOCGSERIAL implementation +- USB: cdc-acm: fix unprivileged TIOCCSERIAL +- usb: gadget: r8a66597: Add missing null check on return from platform_get_resource +- spi: fsl-lpspi: Fix PM reference leak in lpspi_prepare_xfer_hardware() +- spi: spi-zynqmp-gqspi: fix incorrect operating mode in zynqmp_qspi_read_op +- spi: spi-zynqmp-gqspi: transmit dummy circles by using the controller's internal functionality +- spi: spi-zynqmp-gqspi: add mutex locking for exec_op +- spi: spi-zynqmp-gqspi: use wait_for_completion_timeout to make zynqmp_qspi_exec_op not interruptible +- cpufreq: armada-37xx: Fix determining base CPU frequency +- cpufreq: armada-37xx: Fix driver cleanup when registration failed +- clk: mvebu: armada-37xx-periph: Fix workaround for switching from L1 to L0 +- clk: mvebu: armada-37xx-periph: Fix switching CPU freq from 250 Mhz to 1 GHz +- cpufreq: armada-37xx: Fix the AVS value for load L1 +- clk: mvebu: armada-37xx-periph: remove .set_parent method for CPU PM clock +- cpufreq: armada-37xx: Fix setting TBG parent for load levels +- crypto: qat - Fix a double free in adf_create_ring +- crypto: sa2ul - Fix memory leak of rxd +- crypto: sun8i-ss - Fix memory leak of pad +- crypto: allwinner - add missing CRYPTO_ prefix +- ACPI: CPPC: Replace cppc_attr with kobj_attribute +- cpuidle: Fix ARM_QCOM_SPM_CPUIDLE configuration +- PM: runtime: Replace inline function pm_runtime_callbacks_present() +- soc: qcom: mdt_loader: Detect truncated read of segments +- soc: qcom: mdt_loader: Validate that p_filesz < p_memsz +- spi: fsl: add missing iounmap() on error in of_fsl_spi_probe() +- spi: Fix use-after-free with devm_spi_alloc_* +- clocksource/drivers/ingenic_ost: Fix return value check in ingenic_ost_probe() +- clocksource/drivers/timer-ti-dm: Add missing set_state_oneshot_stopped +- clocksource/drivers/timer-ti-dm: Fix posted mode status check order +- PM / devfreq: Use more accurate returned new_freq as resume_freq +- soc: qcom: pdr: Fix error return code in pdr_register_listener +- staging: greybus: uart: fix unprivileged TIOCCSERIAL +- staging: fwserial: fix TIOCGSERIAL implementation +- staging: fwserial: fix TIOCSSERIAL implementation +- staging: rtl8192u: Fix potential infinite loop +- staging: comedi: tests: ni_routes_test: Fix compilation error +- irqchip/gic-v3: Fix OF_BAD_ADDR error handling +- mtd: rawnand: gpmi: Fix a double free in gpmi_nand_init +- iio: adc: Kconfig: make AD9467 depend on ADI_AXI_ADC symbol +- firmware: qcom_scm: Workaround lack of "is available" call on SC7180 +- firmware: qcom_scm: Reduce locking section for __get_convention() +- firmware: qcom_scm: Make __qcom_scm_is_call_available() return bool +- m68k: mvme147,mvme16x: Don't wipe PCC timer config bits +- soundwire: stream: fix memory leak in stream config error path +- memory: pl353: fix mask of ECC page_size config register +- driver core: platform: Declare early_platform_cleanup() prototype +- drivers: nvmem: Fix voltage settings for QTI qfprom-efuse +- USB: gadget: udc: fix wrong pointer passed to IS_ERR() and PTR_ERR() +- usb: gadget: aspeed: fix dma map failure +- crypto: qat - fix error path in adf_isr_resource_alloc() +- crypto: poly1305 - fix poly1305_core_setkey() declaration +- NFSv4.2: fix copy stateid copying for the async copy +- NFSD: Fix sparse warning in nfs4proc.c +- arm64: dts: mediatek: fix reset GPIO level on pumpkin +- phy: marvell: ARMADA375_USBCLUSTER_PHY should not default to y, unconditionally +- phy: ti: j721e-wiz: Delete "clk_div_sel" clk provider during cleanup +- soundwire: bus: Fix device found flag correctly +- bus: qcom: Put child node before return +- arm64: dts: renesas: r8a779a0: Fix PMU interrupt +- mtd: require write permissions for locking and badblock ioctls +- dt-bindings: serial: stm32: Use 'type: object' instead of false for 'additionalProperties' +- usb: gadget: s3c: Fix the error handling path in 's3c2410_udc_probe()' +- usb: gadget: s3c: Fix incorrect resources releasing +- fotg210-udc: Complete OUT requests on short packets +- fotg210-udc: Don't DMA more than the buffer can take +- fotg210-udc: Mask GRP2 interrupts we don't handle +- fotg210-udc: Remove a dubious condition leading to fotg210_done +- fotg210-udc: Fix EP0 IN requests bigger than two packets +- fotg210-udc: Fix DMA on EP0 for length > max packet size +- crypto: qat - ADF_STATUS_PF_RUNNING should be set after adf_dev_init +- crypto: qat - don't release uninitialized resources +- crypto: ccp - fix command queuing to TEE ring buffer +- usb: gadget: pch_udc: Provide a GPIO line used on Intel Minnowboard (v1) +- usb: gadget: pch_udc: Initialize device pointer before use +- usb: gadget: pch_udc: Check for DMA mapping error +- usb: gadget: pch_udc: Check if driver is present before calling ->setup() +- usb: gadget: pch_udc: Replace cpu_to_le32() by lower_32_bits() +- devtmpfs: fix placement of complete() call +- x86/microcode: Check for offline CPUs before requesting new microcode +- spi: stm32: Fix use-after-free on unbind +- arm64: dts: renesas: r8a77980: Fix vin4-7 endpoint binding +- regulator: bd9576: Fix return from bd957x_probe() +- spi: stm32: drop devres version of spi_register_master +- crypto: sun8i-ss - Fix memory leak of object d when dma_iv fails to map +- arm64: dts: qcom: db845c: fix correct powerdown pin for WSA881x +- arm64: dts: qcom: sm8250: fix number of pins in 'gpio-ranges' +- arm64: dts: qcom: sm8150: fix number of pins in 'gpio-ranges' +- arm64: dts: qcom: sdm845: fix number of pins in 'gpio-ranges' +- arm64: dts: qcom: sm8250: Fix timer interrupt to specify EL2 physical timer +- arm64: dts: qcom: sm8250: Fix level triggered PMU interrupt polarity +- ARM: dts: stm32: fix usart 2 & 3 pinconf to wake up with flow control +- mtd: maps: fix error return code of physmap_flash_remove() +- mtd: don't lock when recursively deleting partitions +- mtd: rawnand: qcom: Return actual error code instead of -ENODEV +- mtd: Handle possible -EPROBE_DEFER from parse_mtd_partitions() +- mtd: rawnand: brcmnand: fix OOB R/W with Hamming ECC +- mtd: rawnand: fsmc: Fix error code in fsmc_nand_probe() +- spi: rockchip: avoid objtool warning +- regmap: set debugfs_name to NULL after it is freed +- usb: typec: stusb160x: fix return value check in stusb160x_probe() +- usb: typec: tps6598x: Fix return value check in tps6598x_probe() +- usb: typec: tcpci: Check ROLE_CONTROL while interpreting CC_STATUS +- serial: stm32: fix tx_empty condition +- serial: stm32: add FIFO flush when port is closed +- serial: stm32: fix FIFO flush in startup and set_termios +- serial: stm32: call stm32_transmit_chars locked +- serial: stm32: fix tx dma completion, release channel +- serial: stm32: fix a deadlock in set_termios +- serial: stm32: fix wake-up flag handling +- serial: stm32: fix a deadlock condition with wakeup event +- serial: stm32: fix TX and RX FIFO thresholds +- serial: stm32: fix incorrect characters on console +- serial: stm32: fix startup by enabling usart for reception +- serial: stm32: Use of_device_get_match_data() +- serial: stm32: fix probe and remove order for dma +- serial: stm32: add "_usart" prefix in functions name +- serial: stm32: fix code cleaning warnings and checks +- x86/platform/uv: Set section block size for hubless architectures +- arm64: dts: renesas: Add mmc aliases into board dts files +- ARM: dts: renesas: Add mmc aliases into R-Car Gen2 board dts files +- ARM: dts: s5pv210: correct fuel gauge interrupt trigger level on Fascinate family +- ARM: dts: exynos: correct PMIC interrupt trigger level on Snow +- ARM: dts: exynos: correct PMIC interrupt trigger level on SMDK5250 +- ARM: dts: exynos: correct PMIC interrupt trigger level on Odroid X/U3 family +- ARM: dts: exynos: correct PMIC interrupt trigger level on Midas family +- ARM: dts: exynos: correct MUIC interrupt trigger level on Midas family +- ARM: dts: exynos: correct fuel gauge interrupt trigger level on Midas family +- ARM: dts: exynos: correct fuel gauge interrupt trigger level on GT-I9100 +- memory: gpmc: fix out of bounds read and dereference on gpmc_cs[] +- crypto: sun8i-ss - fix result memory leak on error path +- fpga: fpga-mgr: xilinx-spi: fix error messages on -EPROBE_DEFER +- firmware: xilinx: Remove zynqmp_pm_get_eemi_ops() in IS_REACHABLE(CONFIG_ZYNQMP_FIRMWARE) +- firmware: xilinx: Add a blank line after function declaration +- firmware: xilinx: Fix dereferencing freed memory +- Revert "tools/power turbostat: adjust for temperature offset" +- usb: gadget: pch_udc: Revert d3cb25a12138 completely +- Revert "drm/qxl: do not run release if qxl failed to init" +- ovl: fix missing revert_creds() on error path +- Revert "i3c master: fix missing destroy_workqueue() on error in i3c_master_register" +- Revert "drivers/net/wan/hdlc_fr: Fix a double free in pvc_xmit" +- KVM: arm64: Fix KVM_VGIC_V3_ADDR_TYPE_REDIST_REGION read +- KVM: arm64: Fully zero the vcpu state on reset +- KVM: Stop looking for coalesced MMIO zones if the bus is destroyed +- KVM: Destroy I/O bus devices on unregister failure _after_ sync'ing SRCU +- KVM: arm/arm64: Fix KVM_VGIC_V3_ADDR_TYPE_REDIST read +- KVM: nVMX: Truncate base/index GPR value on address calc in !64-bit +- KVM: nVMX: Truncate bits 63:32 of VMCS field on nested check in !64-bit +- KVM: nVMX: Defer the MMU reload to the normal path on an EPTP switch +- KVM: SVM: Inject #GP on guest MSR_TSC_AUX accesses if RDTSCP unsupported +- KVM: SVM: Do not allow SEV/SEV-ES initialization after vCPUs are created +- KVM: SVM: Don't strip the C-bit from CR2 on #PF interception +- KVM: nSVM: Set the shadow root level to the TDP level for nested NPT +- KVM: x86: Remove emulator's broken checks on CR0/CR3/CR4 loads +- KVM: x86/mmu: Alloc page for PDPTEs when shadowing 32-bit NPT with 64-bit +- KVM: s390: extend kvm_s390_shadow_fault to return entry pointer +- KVM: s390: split kvm_s390_real_to_abs +- KVM: s390: VSIE: fix MVPG handling for prefixing and MSO +- s390: fix detection of vector enhancements facility 1 vs. vector packed decimal facility +- KVM: s390: fix guarded storage control register handling +- KVM: s390: split kvm_s390_logical_to_effective +- KVM: s390: VSIE: correctly handle MVPG when in VSIE +- ALSA: hda/realtek: Fix speaker amp on HP Envy AiO 32 +- ALSA: hda/realtek: ALC285 Thinkpad jack pin quirk is unreachable +- ALSA: hda/realtek: Remove redundant entry for ALC861 Haier/Uniwill devices +- ALSA: hda/realtek: Re-order ALC662 quirk table entries +- ALSA: hda/realtek: Re-order remaining ALC269 quirk table entries +- ALSA: hda/realtek: Re-order ALC269 Lenovo quirk table entries +- ALSA: hda/realtek: Re-order ALC269 Sony quirk table entries +- ALSA: hda/realtek: Re-order ALC269 ASUS quirk table entries +- ALSA: hda/realtek: Re-order ALC269 Dell quirk table entries +- ALSA: hda/realtek: Re-order ALC269 Acer quirk table entries +- ALSA: hda/realtek: Re-order ALC269 HP quirk table entries +- ALSA: hda/realtek: Re-order ALC882 Clevo quirk table entries +- ALSA: hda/realtek: Re-order ALC882 Sony quirk table entries +- ALSA: hda/realtek: Re-order ALC882 Acer quirk table entries +- drm/amdgpu: fix concurrent VM flushes on Vega/Navi v2 +- drm/amd/display: Reject non-zero src_y and src_x for video planes +- drm: bridge/panel: Cleanup connector on bridge detach +- drm/dp_mst: Set CLEAR_PAYLOAD_ID_TABLE as broadcast +- drm/dp_mst: Revise broadcast msg lct & lcr +- drm/radeon: fix copy of uninitialized variable back to userspace +- drm/panfrost: Don't try to map pages that are already mapped +- drm/panfrost: Clear MMU irqs before handling the fault +- drm/qxl: use ttm bo priorities +- drm/i915/gvt: Fix vfio_edid issue for BXT/APL +- drm/i915/gvt: Fix virtual display setup for BXT/APL +- FDDI: defxx: Make MMIO the configuration default except for EISA +- mt76: fix potential DMA mapping leak +- rtw88: Fix array overrun in rtw_get_tx_power_params() +- cfg80211: scan: drop entry from hidden_list on overflow +- ipw2x00: potential buffer overflow in libipw_wx_set_encodeext() +- mt76: mt7615: use ieee80211_free_txskb() in mt7615_tx_token_put() +- md: Fix missing unused status line of /proc/mdstat +- md: md_open returns -EBUSY when entering racing area +- md: factor out a mddev_find_locked helper from mddev_find +- md: split mddev_find +- md-cluster: fix use-after-free issue when removing rdev +- md/bitmap: wait for external bitmap writes to complete during tear down +- async_xor: increase src_offs when dropping destination page +- x86, sched: Treat Intel SNC topology as default, COD as exception +- selinux: add proper NULL termination to the secclass_map permissions +- misc: vmw_vmci: explicitly initialize vmci_datagram payload +- misc: vmw_vmci: explicitly initialize vmci_notify_bm_set_msg struct +- phy: ti: j721e-wiz: Invoke wiz_init() before of_platform_device_create() +- misc: lis3lv02d: Fix false-positive WARN on various HP models +- phy: cadence: Sierra: Fix PHY power_on sequence +- sc16is7xx: Defer probe if device read fails +- iio:adc:ad7476: Fix remove handling +- iio:accel:adis16201: Fix wrong axis assignment that prevents loading +- iio: inv_mpu6050: Fully validate gyro and accel scale writes +- soc/tegra: regulators: Fix locking up when voltage-spread is out of range +- PM / devfreq: Unlock mutex and free devfreq struct in error path +- PCI: keystone: Let AM65 use the pci_ops defined in pcie-designware-host.c +- PCI: xgene: Fix cfg resource mapping +- KVM: x86: Defer the MMU unload to the normal path on an global INVPCID +- PCI: Allow VPD access for QLogic ISP2722 +- FDDI: defxx: Bail out gracefully with unassigned PCI resource for CSR +- MIPS: pci-rt2880: fix slot 0 configuration +- MIPS: pci-mt7620: fix PLL lock check +- ASoC: tlv320aic32x4: Increase maximum register in regmap +- ASoC: tlv320aic32x4: Register clocks before registering component +- ASoC: Intel: kbl_da7219_max98927: Fix kabylake_ssp_fixup function +- ASoC: samsung: tm2_wm5110: check of of_parse return value +- usb: xhci-mtk: improve bandwidth scheduling with TT +- usb: xhci-mtk: remove or operator for setting schedule parameters +- usb: typec: tcpm: update power supply once partner accepts +- usb: typec: tcpm: Address incorrect values of tcpm psy for pps supply +- usb: typec: tcpm: Address incorrect values of tcpm psy for fixed supply +- drm: bridge: fix LONTIUM use of mipi_dsi_() functions +- staging: fwserial: fix TIOCSSERIAL permission check +- tty: moxa: fix TIOCSSERIAL permission check +- staging: fwserial: fix TIOCSSERIAL jiffies conversions +- USB: serial: ti_usb_3410_5052: fix TIOCSSERIAL permission check +- staging: greybus: uart: fix TIOCSSERIAL jiffies conversions +- USB: serial: usb_wwan: fix TIOCSSERIAL jiffies conversions +- tty: amiserial: fix TIOCSSERIAL permission check +- tty: moxa: fix TIOCSSERIAL jiffies conversions +- usb: roles: Call try_module_get() from usb_role_switch_find_by_fwnode() +- Revert "USB: cdc-acm: fix rounding error in TIOCSSERIAL" +- io_uring: truncate lengths larger than MAX_RW_COUNT on provide buffers +- net/nfc: fix use-after-free llcp_sock_bind/connect +- bluetooth: eliminate the potential race condition when removing the HCI controller +- Bluetooth: verify AMP hci_chan before amp_destroy +- thermal/core/fair share: Lock the thermal zone while looping over instances +- thermal/drivers/cpufreq_cooling: Fix slab OOB issue +- lib/vsprintf.c: remove leftover 'f' and 'F' cases from bstr_printf() +- dm rq: fix double free of blk_mq_tag_set in dev remove after table load fails +- dm integrity: fix missing goto in bitmap_flush_interval error handling +- dm space map common: fix division bug in sm_ll_find_free_block() +- dm persistent data: packed struct should have an aligned() attribute too +- tracing: Restructure trace_clock_global() to never block +- tracing: Map all PIDs to command lines +- tools/power turbostat: Fix offset overflow issue in index converting +- rsi: Use resume_noirq for SDIO +- tty: fix memory leak in vc_deallocate +- usb: dwc2: Fix session request interrupt handler +- usb: dwc3: core: Do core softreset when switch mode +- usb: dwc3: gadget: Fix START_TRANSFER link state check +- usb: dwc3: gadget: Remove FS bInterval_m1 limitation +- usb: gadget/function/f_fs string table fix for multiple languages +- usb: gadget: Fix double free of device descriptor pointers +- usb: gadget: dummy_hcd: fix gpf in gadget_setup +- media: venus: hfi_parser: Don't initialize parser on v1 +- media: v4l2-ctrls: fix reference to freed memory +- media: staging/intel-ipu3: Fix race condition during set_fmt +- media: staging/intel-ipu3: Fix set_fmt error handling +- media: staging/intel-ipu3: Fix memory leak in imu_fmt +- media: dvb-usb: Fix memory leak at error in dvb_usb_device_init() +- media: dvb-usb: Fix use-after-free access +- media: dvbdev: Fix memory leak in dvb_media_device_free() +- ext4: Fix occasional generic/418 failure +- ext4: allow the dax flag to be set and cleared on inline directories +- ext4: fix error return code in ext4_fc_perform_commit() +- ext4: fix ext4_error_err save negative errno into superblock +- ext4: fix error code in ext4_commit_super +- ext4: annotate data race in jbd2_journal_dirty_metadata() +- ext4: annotate data race in start_this_handle() +- kbuild: update config_data.gz only when the content of .config is changed +- x86/cpu: Initialize MSR_TSC_AUX if RDTSCP *or* RDPID is supported +- futex: Do not apply time namespace adjustment on FUTEX_LOCK_PI +- Revert 337f13046ff0 ("futex: Allow FUTEX_CLOCK_REALTIME with FUTEX_WAIT op") +- smb3: do not attempt multichannel to server which does not support it +- smb3: when mounting with multichannel include it in requested capabilities +- Fix misc new gcc warnings +- security: commoncap: fix -Wstringop-overread warning +- sfc: farch: fix TX queue lookup in TX event handling +- sfc: farch: fix TX queue lookup in TX flush done handling +- exfat: fix erroneous discard when clear cluster bit +- fuse: fix write deadlock +- dm raid: fix inconclusive reshape layout on fast raid4/5/6 table reload sequences +- md/raid1: properly indicate failure when ending a failed write request +- crypto: rng - fix crypto_rng_reset() refcounting when !CRYPTO_STATS +- crypto: arm/curve25519 - Move '.fpu' after '.arch' +- tpm: vtpm_proxy: Avoid reading host log when using a virtual device +- tpm: efi: Use local variable for calculating final log size +- intel_th: pci: Add Alder Lake-M support +- powerpc: fix EDEADLOCK redefinition error in uapi/asm/errno.h +- powerpc/32: Fix boot failure with CONFIG_STACKPROTECTOR +- powerpc/kexec_file: Use current CPU info while setting up FDT +- powerpc/eeh: Fix EEH handling for hugepages in ioremap space. +- powerpc/powernv: Enable HAIL (HV AIL) for ISA v3.1 processors +- jffs2: Hook up splice_write callback +- jffs2: Fix kasan slab-out-of-bounds problem +- Input: ili210x - add missing negation for touch indication on ili210x +- NFSv4: Don't discard segments marked for return in _pnfs_return_layout() +- NFS: Don't discard pNFS layout segments that are marked for return +- NFS: fs_context: validate UDP retrans to prevent shift out-of-bounds +- ACPI: GTDT: Don't corrupt interrupt mappings on watchdow probe failure +- openvswitch: fix stack OOB read while fragmenting IPv4 packets +- mlxsw: spectrum_mr: Update egress RIF list before route's action +- f2fs: fix to avoid out-of-bounds memory access +- f2fs: fix error handling in f2fs_end_enable_verity() +- ubifs: Only check replay with inode type to judge if inode linked +- kcsan, debugfs: Move debugfs file creation out of early init +- virtiofs: fix memory leak in virtio_fs_probe() +- fs: fix reporting supported extra file attributes for statx() +- Makefile: Move -Wno-unused-but-set-variable out of GCC only block +- arm64/vdso: Discard .note.gnu.property sections in vDSO +- btrfs: fix race when picking most recent mod log operation for an old root +- tools/power/turbostat: Fix turbostat for AMD Zen CPUs +- ALSA: hda/realtek: Add quirk for Intel Clevo PCx0Dx +- ALSA: hda/realtek: fix static noise on ALC285 Lenovo laptops +- ALSA: hda/realtek - Headset Mic issue on HP platform +- ALSA: hda/realtek: fix mic boost on Intel NUC 8 +- ALSA: hda/realtek: GA503 use same quirks as GA401 +- ALSA: hda/realtek: fix mute/micmute LEDs for HP ProBook 445 G7 +- ALSA: usb-audio: Add dB range mapping for Sennheiser Communications Headset PC 8 +- ALSA: usb-audio: Explicitly set up the clock selector +- ALSA: sb: Fix two use after free in snd_sb_qsound_build +- ALSA: hda/conexant: Re-order CX5066 quirk table entries +- ALSA: emu8000: Fix a use after free in snd_emu8000_create_mixer +- power: supply: cpcap-battery: fix invalid usage of list cursor +- sched,psi: Handle potential task count underflow bugs more gracefully +- s390/archrandom: add parameter check for s390_arch_random_generate +- block/rnbd-clt: Fix missing a memory free when unloading the module +- sched,fair: Alternative sched_slice() +- perf: Rework perf_event_exit_event() +- scsi: libfc: Fix a format specifier +- mfd: arizona: Fix rumtime PM imbalance on error +- mfd: da9063: Support SMBus and I2C mode +- mfd: intel-m10-bmc: Fix the register access range +- scsi: lpfc: Remove unsupported mbox PORT_CAPABILITIES logic +- scsi: lpfc: Fix error handling for mailboxes completed in MBX_POLL mode +- scsi: lpfc: Fix crash when a REG_RPI mailbox fails triggering a LOGO response +- drm/amdgpu: fix NULL pointer dereference +- drm/amd/display: Try YCbCr420 color when YCbCr444 fails +- amdgpu: avoid incorrect %hu format string +- drm/amdkfd: Fix cat debugfs hang_hws file causes system crash bug +- drm/amd/display: Fix UBSAN: shift-out-of-bounds warning +- drm/amd/display: Fix debugfs link_settings entry +- drm/radeon/ttm: Fix memory leak userptr pages +- drm/amdgpu/ttm: Fix memory leak userptr pages +- drm/msm/mdp5: Do not multiply vclk line count by 100 +- drm/msm/mdp5: Configure PP_SYNC_HEIGHT to double the vtotal +- sched/fair: Ignore percpu threads for imbalance pulls +- media: gscpa/stv06xx: fix memory leak +- media: dvb-usb: fix memory leak in dvb_usb_adapter_init +- media: sun8i-di: Fix runtime PM imbalance in deinterlace_start_streaming +- media: platform: sti: Fix runtime PM imbalance in regs_show +- media: i2c: adv7842: fix possible use-after-free in adv7842_remove() +- media: i2c: tda1997: Fix possible use-after-free in tda1997x_remove() +- media: i2c: adv7511-v4l2: fix possible use-after-free in adv7511_remove() +- media: adv7604: fix possible use-after-free in adv76xx_remove() +- media: tc358743: fix possible use-after-free in tc358743_remove() +- power: supply: s3c_adc_battery: fix possible use-after-free in s3c_adc_bat_remove() +- power: supply: generic-adc-battery: fix possible use-after-free in gab_remove() +- clk: socfpga: arria10: Fix memory leak of socfpga_clk on error return +- drm/msm/dp: Fix incorrect NULL check kbot warnings in DP driver +- media: vivid: update EDID +- media: em28xx: fix memory leak +- scsi: scsi_dh_alua: Remove check for ASC 24h in alua_rtpg() +- scsi: smartpqi: Add new PCI IDs +- scsi: smartpqi: Correct request leakage during reset operations +- scsi: smartpqi: Use host-wide tag space +- power: supply: cpcap-charger: Add usleep to cpcap charger to avoid usb plug bounce +- selftests/resctrl: Fix checking for < 0 for unsigned values +- selftests/resctrl: Fix incorrect parsing of iMC counters +- selftests/resctrl: Use resctrl/info for feature detection +- selftests/resctrl: Fix missing options "-n" and "-p" +- selftests/resctrl: Clean up resctrl features check +- selftests/resctrl: Fix compilation issues for other global variables +- selftests/resctrl: Fix compilation issues for global variables +- selftests/resctrl: Enable gcc checks to detect buffer overflows +- nvmet: return proper error code from discovery ctrl +- drm/komeda: Fix bit check to import to value of proper type +- ata: ahci: Disable SXS for Hisilicon Kunpeng920 +- mmc: sdhci-brcmstb: Remove CQE quirk +- mmc: sdhci-pci: Add PCI IDs for Intel LKF +- mmc: sdhci-esdhc-imx: validate pinctrl before use it +- scsi: qla2xxx: Fix use after free in bsg +- drm/vkms: fix misuse of WARN_ON +- scsi: qla2xxx: Always check the return value of qla24xx_get_isp_stats() +- drm/amd/display: fix dml prefetch validation +- drm/amd/display: DCHUB underflow counter increasing in some scenarios +- drm/amd/display: Fix UBSAN warning for not a valid value for type '_Bool' +- drm/amd/pm: fix workload mismatch on vega10 +- drm/amdgpu : Fix asic reset regression issue introduce by 8f211fe8ac7c4f +- drm/amdkfd: Fix UBSAN shift-out-of-bounds warning +- drm/amdgpu: mask the xgmi number of hops reported from psp to kfd +- backlight: qcom-wled: Fix FSC update issue for WLED5 +- backlight: qcom-wled: Use sink_addr for sync toggle +- power: supply: Use IRQF_ONESHOT +- media: gspca/sq905.c: fix uninitialized variable +- media: media/saa7164: fix saa7164_encoder_register() memory leak bugs +- extcon: arizona: Fix various races on driver unbind +- extcon: arizona: Fix some issues when HPDET IRQ fires after the jack has been unplugged +- power: supply: bq27xxx: fix power_avg for newer ICs +- atomisp: don't let it go past pipes array +- media: imx: capture: Return -EPIPE from __capture_legacy_try_fmt() +- media: drivers: media: pci: sta2x11: fix Kconfig dependency on GPIOLIB +- media: ite-cir: check for receive overflow +- scsi: target: pscsi: Fix warning in pscsi_complete_cmd() +- kvfree_rcu: Use same set of GFP flags as does single-argument +- sched/pelt: Fix task util_est update filtering +- drm/amdgpu: Fix some unload driver issues +- scsi: lpfc: Fix pt2pt connection does not recover after LOGO +- scsi: lpfc: Fix incorrect dbde assignment when building target abts wqe +- drm/amd/display/dc/dce/dce_aux: Remove duplicate line causing 'field overwritten' issue +- drm/amdgpu/display: buffer INTERRUPT_LOW_IRQ_CONTEXT interrupt work +- drm/amd/display: Don't optimize bandwidth before disabling planes +- drm/amd/display: Check for DSC support instead of ASIC revision +- drm/ast: fix memory leak when unload the driver +- drm/amd/display: changing sr exit latency +- drm/ast: Fix invalid usage of AST_MAX_HWC_WIDTH in cursor atomic_check +- drm/qxl: release shadow on shutdown +- drm/qxl: do not run release if qxl failed to init +- drm: Added orientation quirk for OneGX1 Pro +- btrfs: convert logic BUG_ON()'s in replace_path to ASSERT()'s +- btrfs: do proper error handling in btrfs_update_reloc_root +- btrfs: do proper error handling in create_reloc_root +- spi: sync up initial chipselect state +- platform/x86: intel_pmc_core: Don't use global pmcdev in quirks +- crypto: omap-aes - Fix PM reference leak on omap-aes.c +- crypto: sa2ul - Fix PM reference leak in sa_ul_probe() +- crypto: stm32/cryp - Fix PM reference leak on stm32-cryp.c +- crypto: stm32/hash - Fix PM reference leak on stm32-hash.c +- crypto: sun8i-ce - Fix PM reference leak in sun8i_ce_probe() +- crypto: sun8i-ss - Fix PM reference leak when pm_runtime_get_sync() fails +- phy: phy-twl4030-usb: Fix possible use-after-free in twl4030_usb_remove() +- intel_th: Consistency and off-by-one fix +- tty: n_gsm: check error while registering tty devices +- usb: dwc3: gadget: Check for disabled LPM quirk +- usb: core: hub: Fix PM reference leak in usb_port_resume() +- usb: musb: fix PM reference leak in musb_irq_work() +- usb: gadget: tegra-xudc: Fix possible use-after-free in tegra_xudc_remove() +- spi: qup: fix PM reference leak in spi_qup_remove() +- spi: omap-100k: Fix reference leak to master +- spi: dln2: Fix reference leak to master +- platform/x86: ISST: Account for increased timeout in some cases +- tools/power/x86/intel-speed-select: Increase string size +- ARM: dts: at91: change the key code of the gpio key +- bus: mhi: core: Clear context for stopped channels from remove() +- xhci: fix potential array out of bounds with several interrupters +- xhci: check control context is valid before dereferencing it. +- xhci: check port array allocation was successful before dereferencing it +- fpga: dfl: pci: add DID for D5005 PAC cards +- usb: xhci-mtk: support quirk to disable usb2 lpm +- random: initialize ChaCha20 constants with correct endianness +- perf/arm_pmu_platform: Fix error handling +- perf/arm_pmu_platform: Use dev_err_probe() for IRQ errors +- soundwire: cadence: only prepare attached devices on clock stop +- tee: optee: do not check memref size on return from Secure World +- arm64: dts: imx8mq-librem5-r3: Mark buck3 as always on +- soc/tegra: pmc: Fix completion of power-gate toggling +- efi/libstub: Add $(CLANG_FLAGS) to x86 flags +- x86/boot: Add $(CLANG_FLAGS) to compressed KBUILD_CFLAGS +- x86/build: Propagate $(CLANG_FLAGS) to $(REALMODE_FLAGS) +- ARM: dts: ux500: Fix up TVK R3 sensors +- ARM: dts: BCM5301X: fix "reg" formatting in /memory node +- kselftest/arm64: mte: Fix MTE feature detection +- PCI: PM: Do not read power state in pci_enable_device_flags() +- ARM: tegra: acer-a500: Rename avdd to vdda of touchscreen node +- kselftest/arm64: mte: Fix compilation with native compiler +- usb: xhci: Fix port minor revision +- usb: dwc3: gadget: Ignore EP queue requests during bus reset +- usb: gadget: f_uac1: validate input parameters +- usb: gadget: f_uac2: validate input parameters +- genirq/matrix: Prevent allocation counter corruption +- crypto: hisilicon/sec - fixes a printing error +- x86/sev: Do not require Hypervisor CPUID bit for SEV guests +- usb: webcam: Invalid size of Processing Unit Descriptor +- usb: gadget: uvc: add bInterval checking for HS mode +- crypto: qat - fix unmap invalid dma address +- crypto: api - check for ERR pointers in crypto_destroy_tfm() +- bus: mhi: core: Destroy SBL devices when moving to mission mode +- spi: ath79: remove spi-master setup and cleanup assignment +- spi: ath79: always call chipselect function +- staging: wimax/i2400m: fix byte-order issue +- bus: ti-sysc: Probe for l4_wkup and l4_cfg interconnect devices first +- cpuidle: tegra: Fix C7 idling state on Tegra114 +- fbdev: zero-fill colormap in fbcmap.c +- btrfs: fix race between transaction aborts and fsyncs leading to use-after-free +- intel_th: pci: Add Rocket Lake CPU support +- btrfs: fix metadata extent leak after failure to create subvolume +- x86/build: Disable HIGHMEM64G selection for M486SX +- btrfs: handle remount to no compress during compression +- smb2: fix use-after-free in smb2_ioctl_query_info() +- cifs: detect dead connections only when echoes are enabled. +- cifs: fix out-of-bound memory access when calling smb3_notify() at mount point +- cifs: Return correct error code from smb2_get_enc_key +- irqchip/gic-v3: Do not enable irqs when handling spurious interrups +- mmc: core: Fix hanging on I/O during system suspend for removable cards +- mmc: core: Set read only for SD cards with permanent write protect bit +- mmc: core: Do a power cycle when the CMD11 fails +- mmc: block: Issue a cache flush only when it's enabled +- mmc: block: Update ext_csd.cache_ctrl if it was written +- mmc: sdhci-tegra: Add required callbacks to set/clear CQE_EN bit +- mmc: sdhci-pci: Fix initialization of some SD cards for Intel BYT-based controllers +- mmc: sdhci: Check for reset prior to DMA address unmap +- mmc: uniphier-sd: Fix a resource leak in the remove function +- mmc: uniphier-sd: Fix an error handling path in uniphier_sd_probe() +- scsi: mpt3sas: Block PCI config access from userspace during reset +- scsi: qla2xxx: Fix crash in qla2xxx_mqueuecommand() +- spi: spi-ti-qspi: Free DMA resources +- spi: stm32-qspi: fix pm_runtime usage_count counter +- erofs: add unsupported inode i_format check +- mtd: physmap: physmap-bt1-rom: Fix unintentional stack access +- mtd: rawnand: atmel: Update ecc_stats.corrected counter +- mtd: spinand: core: add missing MODULE_DEVICE_TABLE() +- Revert "mtd: spi-nor: macronix: Add support for mx25l51245g" +- mtd: spi-nor: core: Fix an issue of releasing resources during read/write +- fs/epoll: restore waking from ep_done_scan() +- ecryptfs: fix kernel panic with null dev_name +- arm64: dts: mt8173: fix property typo of 'phys' in dsi node +- arm64: dts: marvell: armada-37xx: add syscon compatible to NB clk node +- ARM: 9056/1: decompressor: fix BSS size calculation for LLVM ld.lld +- ftrace: Handle commands when closing set_ftrace_filter file +- ACPI: custom_method: fix a possible memory leak +- ACPI: custom_method: fix potential use-after-free issue +- tpm: acpi: Check eventlog signature before using it +- vhost-vdpa: fix vm_flags for virtqueue doorbell mapping +- s390/zcrypt: fix zcard and zqueue hot-unplug memleak +- s390/disassembler: increase ebpf disasm buffer size +- dyndbg: fix parsing file query without a line-range suffix +- nitro_enclaves: Fix stale file descriptors on failed usercopy +- bus: mhi: core: Sanity check values from remote device before use +- bus: mhi: core: Clear configuration from channel context during reset +- bus: mhi: core: Fix check for syserr at power_up +- vfio: Depend on MMU +- perf/core: Fix unconditional security_locked_down() call +- platform/x86: thinkpad_acpi: Correct thermal sensor allocation +- USB: Add reset-resume quirk for WD19's Realtek Hub +- USB: Add LPM quirk for Lenovo ThinkPad USB-C Dock Gen2 Ethernet +- ALSA: usb-audio: Add MIDI quirk for Vox ToneLab EX +- ovl: allow upperdir inside lowerdir +- ovl: fix leaked dentry +- nvme-pci: set min_align_mask +- swiotlb: respect min_align_mask +- swiotlb: don't modify orig_addr in swiotlb_tbl_sync_single +- swiotlb: refactor swiotlb_tbl_map_single +- swiotlb: clean up swiotlb_tbl_unmap_single +- swiotlb: factor out a nr_slots helper +- swiotlb: factor out an io_tlb_offset helper +- swiotlb: add a IO_TLB_SIZE define +- driver core: add a min_align_mask field to struct device_dma_parameters +- tools/cgroup/slabinfo.py: updated to work on current kernel +- perf ftrace: Fix access to pid in array when setting a pid filter +- capabilities: require CAP_SETFCAP to map uid 0 +- perf data: Fix error return code in perf_data__create_dir() +- net: qrtr: Avoid potential use after free in MHI send +- bpf: Fix leakage of uninitialized bpf stack under speculation +- bpf: Fix masking negation logic upon negative dst register +- igb: Enable RSS for Intel I211 Ethernet Controller +- net: usb: ax88179_178a: initialize local variables before use +- netfilter: conntrack: Make global sysctls readonly in non-init netns +- mips: Do not include hi and lo in clobber list for R6 +- mei: me: add Alder Lake P device id. +- iwlwifi: Fix softirq/hardirq disabling in iwl_pcie_gen2_enqueue_hcmd() +- ext4: fix check to prevent false positive report of incorrect used inodes +- iommu/arm-smmu-v3: Maintain a SID->device structure +- iommu: Add a page fault handler +- uacce: Enable IOMMU_DEV_FEAT_IOPF +- iommu/vt-d: Support IOMMU_DEV_FEAT_IOPF +- iommu: Separate IOMMU_DEV_FEAT_IOPF from IOMMU_DEV_FEAT_SVA +- iommu/arm-smmu-v3: Use device properties for pasid-num-bits +- iommu: Fix comment for struct iommu_fwspec +- iommu: Switch gather->end to the inclusive end +- iommu: Add iova and size as parameters in iotlb_sync_map +- iommu/arm-smmu-v3: Add support for VHE +- iommu/arm-smmu-v3: Make BTM optional for SVA +- iommu/arm-smmu-v3: Split arm_smmu_tlb_inv_range() +- iommu/io-pgtable: Remove tlb_flush_leaf +- iommu/arm-smmu-v3: Remove the page 1 fixup +- iommu/arm-smmu-v3: Use DEFINE_RES_MEM() to simplify code +- iommu/arm-smmu-v3: Assign boolean values to a bool variable +- iommu/arm-smmu-v3: Hook up ATC invalidation to mm ops +- iommu/arm-smmu-v3: Implement iommu_sva_bind/unbind() +- iommu/sva: Add PASID helpers +- iommu/ioasid: Add ioasid references +- ext4: do not set SB_ACTIVE in ext4_orphan_cleanup() +- arm64: Remove arm64_dma32_phys_limit and its uses +- USB: CDC-ACM: fix poison/unpoison imbalance +- net: hso: fix NULL-deref on disconnect regression +- x86/crash: Fix crash_setup_memmap_entries() out-of-bounds access +- ia64: tools: remove duplicate definition of ia64_mf() on ia64 +- ia64: fix discontig.c section mismatches +- csky: change a Kconfig symbol name to fix e1000 build error +- kasan: fix hwasan build for gcc +- cavium/liquidio: Fix duplicate argument +- xen-netback: Check for hotplug-status existence before watching +- arm64: kprobes: Restore local irqflag if kprobes is cancelled +- s390/entry: save the caller of psw_idle +- dmaengine: tegra20: Fix runtime PM imbalance on error +- net: geneve: check skb is large enough for IPv4/IPv6 header +- ARM: dts: Fix swapped mmc order for omap3 +- dmaengine: xilinx: dpdma: Fix race condition in done IRQ +- dmaengine: xilinx: dpdma: Fix descriptor issuing on video group +- soc: qcom: geni: shield geni_icc_get() for ACPI boot +- HID: wacom: Assign boolean values to a bool variable +- HID cp2112: fix support for multiple gpiochips +- HID: alps: fix error return code in alps_input_configured() +- HID: google: add don USB id +- perf map: Fix error return code in maps__clone() +- perf auxtrace: Fix potential NULL pointer dereference +- perf/x86/kvm: Fix Broadwell Xeon stepping in isolation_ucodes[] +- perf/x86/intel/uncore: Remove uncore extra PCI dev HSWEP_PCI_PCU_3 +- locking/qrwlock: Fix ordering in queued_write_lock_slowpath() +- bpf: Tighten speculative pointer arithmetic mask +- bpf: Refactor and streamline bounds check into helper +- bpf: Allow variable-offset stack access +- bpf: Permits pointers on stack for helper calls +- arm64: dts: allwinner: Revert SD card CD GPIO for Pine64-LTS +- pinctrl: core: Show pin numbers for the controllers with base = 0 +- block: return -EBUSY when there are open partitions in blkdev_reread_part +- pinctrl: lewisburg: Update number of pins in community +- vdpa/mlx5: Set err = -ENOMEM in case dma_map_sg_attrs fails +- KEYS: trusted: Fix TPM reservation for seal/unseal +- gpio: omap: Save and restore sysconfig +- vhost-vdpa: protect concurrent access to vhost device iotlb +- arm32: kaslr: Bugfix of fiq when enabled kaslr +- perf kmem: Do not pass additional arguments to 'perf record' +- arm_pmu: Fix write counter error in ARMv7 big-endian mode +- kdump: replace memblock_phys_alloc_range() with memblock_find_in_range() + memblock_reserve() +- openeuler_defconfig: Enable hifc driver as module +- scsi/hifc: add FC service module of hifc driver +- scsi/hifc: add scsi module of hifc driver +- scsi/hifc: add io module of hifc driver +- scsi/hifc: add port resource module of hifc driver +- scsi/hifc: add port manager module of hifc driver +- scsi/hifc: add chip resource module of hifc driver +- net: phy: marvell: fix detection of PHY on Topaz switches +- bpf: Move sanitize_val_alu out of op switch +- bpf: Improve verifier error messages for users +- bpf: Rework ptr_limit into alu_limit and add common error path +- arm64: mte: Ensure TIF_MTE_ASYNC_FAULT is set atomically +- ARM: 9071/1: uprobes: Don't hook on thumb instructions +- bpf: Move off_reg into sanitize_ptr_alu +- bpf: Ensure off_reg has no mixed signed bounds for all types +- r8169: don't advertise pause in jumbo mode +- r8169: tweak max read request size for newer chips also in jumbo mtu mode +- KVM: VMX: Don't use vcpu->run->internal.ndata as an array index +- KVM: VMX: Convert vcpu_vmx.exit_reason to a union +- bpf: Use correct permission flag for mixed signed bounds arithmetic +- arm64: dts: allwinner: h6: beelink-gs1: Remove ext. 32 kHz osc reference +- arm64: dts: allwinner: Fix SD card CD GPIO for SOPine systems +- ARM: OMAP2+: Fix uninitialized sr_inst +- ARM: footbridge: fix PCI interrupt mapping +- ARM: 9069/1: NOMMU: Fix conversion for_each_membock() to for_each_mem_range() +- ARM: OMAP2+: Fix warning for omap_init_time_of() +- gro: ensure frag0 meets IP header alignment +- ch_ktls: do not send snd_una update to TCB in middle +- ch_ktls: tcb close causes tls connection failure +- ch_ktls: fix device connection close +- ch_ktls: Fix kernel panic +- ibmvnic: remove duplicate napi_schedule call in open function +- ibmvnic: remove duplicate napi_schedule call in do_reset function +- ibmvnic: avoid calling napi_disable() twice +- ia64: tools: remove inclusion of ia64-specific version of errno.h header +- ia64: remove duplicate entries in generic_defconfig +- ethtool: pause: make sure we init driver stats +- i40e: fix the panic when running bpf in xdpdrv mode +- net: Make tcp_allowed_congestion_control readonly in non-init netns +- mm: ptdump: fix build failure +- net: ip6_tunnel: Unregister catch-all devices +- net: sit: Unregister catch-all devices +- net: davicom: Fix regulator not turned off on failed probe +- net/mlx5e: Fix setting of RS FEC mode +- netfilter: nft_limit: avoid possible divide error in nft_limit_init +- net/mlx5e: fix ingress_ifindex check in mlx5e_flower_parse_meta +- net: macb: fix the restore of cmp registers +- libbpf: Fix potential NULL pointer dereference +- netfilter: arp_tables: add pre_exit hook for table unregister +- netfilter: bridge: add pre_exit hooks for ebtable unregistration +- libnvdimm/region: Fix nvdimm_has_flush() to handle ND_REGION_ASYNC +- ice: Fix potential infinite loop when using u8 loop counter +- netfilter: conntrack: do not print icmpv6 as unknown via /proc +- netfilter: flowtable: fix NAT IPv6 offload mangling +- ixgbe: fix unbalanced device enable/disable in suspend/resume +- scsi: libsas: Reset num_scatter if libata marks qc as NODATA +- riscv: Fix spelling mistake "SPARSEMEM" to "SPARSMEM" +- vfio/pci: Add missing range check in vfio_pci_mmap +- arm64: alternatives: Move length validation in alternative_{insn, endif} +- arm64: fix inline asm in load_unaligned_zeropad() +- readdir: make sure to verify directory entry for legacy interfaces too +- dm verity fec: fix misaligned RS roots IO +- HID: wacom: set EV_KEY and EV_ABS only for non-HID_GENERIC type of devices +- Input: i8042 - fix Pegatron C15B ID entry +- Input: s6sy761 - fix coordinate read bit shift +- lib: fix kconfig dependency on ARCH_WANT_FRAME_POINTERS +- virt_wifi: Return micros for BSS TSF values +- mac80211: clear sta->fast_rx when STA removed from 4-addr VLAN +- pcnet32: Use pci_resource_len to validate PCI resource +- net: ieee802154: forbid monitor for add llsec seclevel +- net: ieee802154: stop dump llsec seclevels for monitors +- net: ieee802154: forbid monitor for del llsec devkey +- net: ieee802154: forbid monitor for add llsec devkey +- net: ieee802154: stop dump llsec devkeys for monitors +- net: ieee802154: forbid monitor for del llsec dev +- net: ieee802154: forbid monitor for add llsec dev +- net: ieee802154: stop dump llsec devs for monitors +- net: ieee802154: forbid monitor for del llsec key +- net: ieee802154: forbid monitor for add llsec key +- net: ieee802154: stop dump llsec keys for monitors +- iwlwifi: add support for Qu with AX201 device +- scsi: scsi_transport_srp: Don't block target in SRP_PORT_LOST state +- ASoC: fsl_esai: Fix TDM slot setup for I2S mode +- drm/msm: Fix a5xx/a6xx timestamps +- ARM: omap1: fix building with clang IAS +- ARM: keystone: fix integer overflow warning +- neighbour: Disregard DEAD dst in neigh_update +- gpu/xen: Fix a use after free in xen_drm_drv_init +- ASoC: max98373: Added 30ms turn on/off time delay +- ASoC: max98373: Changed amp shutdown register as volatile +- xfrm: BEET mode doesn't support fragments for inner packets +- iwlwifi: Fix softirq/hardirq disabling in iwl_pcie_enqueue_hcmd() +- arc: kernel: Return -EFAULT if copy_to_user() fails +- lockdep: Add a missing initialization hint to the "INFO: Trying to register non-static key" message +- ARM: dts: Fix moving mmc devices with aliases for omap4 & 5 +- ARM: dts: Drop duplicate sha2md5_fck to fix clk_disable race +- ACPI: x86: Call acpi_boot_table_init() after acpi_table_upgrade() +- dmaengine: idxd: fix wq cleanup of WQCFG registers +- dmaengine: plx_dma: add a missing put_device() on error path +- dmaengine: Fix a double free in dma_async_device_register +- dmaengine: dw: Make it dependent to HAS_IOMEM +- dmaengine: idxd: fix wq size store permission state +- dmaengine: idxd: fix opcap sysfs attribute output +- dmaengine: idxd: fix delta_rec and crc size field for completion record +- dmaengine: idxd: Fix clobbering of SWERR overflow bit on writeback +- gpio: sysfs: Obey valid_mask +- Input: nspire-keypad - enable interrupts only when opened +- mtd: rawnand: mtk: Fix WAITRDY break condition and timeout +- net/sctp: fix race condition in sctp_destroy_sock +- xen/events: fix setting irq affinity +- net: sfp: cope with SFPs that set both LOS normal and LOS inverted +- net: sfp: relax bitrate-derived mode check +- perf map: Tighten snprintf() string precision to pass gcc check on some 32-bit arches +- netfilter: x_tables: fix compat match/target pad out-of-bound write +- block: don't ignore REQ_NOWAIT for direct IO +- riscv,entry: fix misaligned base for excp_vect_table +- io_uring: don't mark S_ISBLK async work as unbounded +- null_blk: fix command timeout completion handling +- idr test suite: Create anchor before launching throbber +- idr test suite: Take RCU read lock in idr_find_test_1 +- radix tree test suite: Register the main thread with the RCU library +- block: only update parent bi_status when bio fail +- XArray: Fix splitting to non-zero orders +- gpu: host1x: Use different lock classes for each client +- drm/tegra: dc: Don't set PLL clock to 0Hz +- tools/kvm_stat: Add restart delay +- ftrace: Check if pages were allocated before calling free_pages() +- gfs2: report "already frozen/thawed" errors +- drm/imx: imx-ldb: fix out of bounds array access warning +- KVM: arm64: Disable guest access to trace filter controls +- KVM: arm64: Hide system instruction access to Trace registers +- gfs2: Flag a withdraw if init_threads() fails +- interconnect: core: fix error return code of icc_link_destroy() +- Revert "net: sched: bump refcount for new action in ACT replace mode" +- net: ieee802154: stop dump llsec params for monitors +- net: ieee802154: forbid monitor for del llsec seclevel +- net: ieee802154: forbid monitor for set llsec params +- net: ieee802154: fix nl802154 del llsec devkey +- net: ieee802154: fix nl802154 add llsec key +- net: ieee802154: fix nl802154 del llsec dev +- net: ieee802154: fix nl802154 del llsec key +- net: ieee802154: nl-mac: fix check on panid +- net: mac802154: Fix general protection fault +- drivers: net: fix memory leak in peak_usb_create_dev +- drivers: net: fix memory leak in atusb_probe +- net: tun: set tun->dev->addr_len during TUNSETLINK processing +- cfg80211: remove WARN_ON() in cfg80211_sme_connect +- gpiolib: Read "gpio-line-names" from a firmware node +- net: sched: bump refcount for new action in ACT replace mode +- dt-bindings: net: ethernet-controller: fix typo in NVMEM +- lockdep: Address clang -Wformat warning printing for %hd +- clk: socfpga: fix iomem pointer cast on 64-bit +- RAS/CEC: Correct ce_add_elem()'s returned values +- vdpa/mlx5: Fix wrong use of bit numbers +- vdpa/mlx5: should exclude header length and fcs from mtu +- RDMA/addr: Be strict with gid size +- i40e: Fix parameters in aq_get_phy_register() +- drm/vc4: crtc: Reduce PV fifo threshold on hvs4 +- RDMA/qedr: Fix kernel panic when trying to access recv_cq +- perf report: Fix wrong LBR block sorting +- RDMA/cxgb4: check for ipv6 address properly while destroying listener +- net/mlx5: Fix PBMC register mapping +- net/mlx5: Fix PPLM register mapping +- net/mlx5: Fix placement of log_max_flow_counter +- net: hns3: clear VF down state bit before request link status +- tipc: increment the tmp aead refcnt before attaching it +- can: mcp251x: fix support for half duplex SPI host controllers +- iwlwifi: fix 11ax disabled bit in the regulatory capability flags +- i2c: designware: Adjust bus_freq_hz when refuse high speed mode set +- openvswitch: fix send of uninitialized stack memory in ct limit reply +- net: openvswitch: conntrack: simplify the return expression of ovs_ct_limit_get_default_limit() +- perf inject: Fix repipe usage +- s390/cpcmd: fix inline assembly register clobbering +- workqueue: Move the position of debug_work_activate() in __queue_work() +- clk: fix invalid usage of list cursor in unregister +- clk: fix invalid usage of list cursor in register +- net: macb: restore cmp registers on resume path +- net: cls_api: Fix uninitialised struct field bo->unlocked_driver_cb +- scsi: ufs: core: Fix wrong Task Tag used in task management request UPIUs +- scsi: ufs: core: Fix task management request completion timeout +- mptcp: forbit mcast-related sockopt on MPTCP sockets +- net: udp: Add support for getsockopt(..., ..., UDP_GRO, ..., ...); +- drm/msm: Set drvdata to NULL when msm_drm_init() fails +- RDMA/rtrs-clt: Close rtrs client conn before destroying rtrs clt session files +- i40e: Fix display statistics for veb_tc +- soc/fsl: qbman: fix conflicting alignment attributes +- xdp: fix xdp_return_frame() kernel BUG throw for page_pool memory model +- net/rds: Fix a use after free in rds_message_map_pages +- net/mlx5: Don't request more than supported EQs +- net/mlx5e: Fix ethtool indication of connector type +- net/mlx5e: Fix mapping of ct_label zero +- ASoC: sunxi: sun4i-codec: fill ASoC card owner +- I2C: JZ4780: Fix bug for Ingenic X1000. +- net: phy: broadcom: Only advertise EEE for supported modes +- nfp: flower: ignore duplicate merge hints from FW +- net: qrtr: Fix memory leak on qrtr_tx_wait failure +- net/ncsi: Avoid channel_monitor hrtimer deadlock +- ARM: dts: imx6: pbab01: Set vmmc supply for both SD interfaces +- net:tipc: Fix a double free in tipc_sk_mcast_rcv +- cxgb4: avoid collecting SGE_QBASE regs during traffic +- net: dsa: Fix type was not set for devlink port +- gianfar: Handle error code at MAC address change +- ethernet: myri10ge: Fix a use after free in myri10ge_sw_tso +- mlxsw: spectrum: Fix ECN marking in tunnel decapsulation +- can: isotp: fix msg_namelen values depending on CAN_REQUIRED_SIZE +- can: bcm/raw: fix msg_namelen values depending on CAN_REQUIRED_SIZE +- xfrm: Provide private skb extensions for segmented and hw offloaded ESP packets +- arm64: dts: imx8mm/q: Fix pad control of SD1_DATA0 +- drivers/net/wan/hdlc_fr: Fix a double free in pvc_xmit +- sch_red: fix off-by-one checks in red_check_params() +- geneve: do not modify the shared tunnel info when PMTU triggers an ICMP reply +- vxlan: do not modify the shared tunnel info when PMTU triggers an ICMP reply +- amd-xgbe: Update DMA coherency values +- hostfs: fix memory handling in follow_link() +- i40e: Fix kernel oops when i40e driver removes VF's +- i40e: Added Asym_Pause to supported link modes +- virtchnl: Fix layout of RSS structures +- xfrm: Fix NULL pointer dereference on policy lookup +- ASoC: wm8960: Fix wrong bclk and lrclk with pll enabled for some chips +- ASoC: SOF: Intel: HDA: fix core status verification +- esp: delete NETIF_F_SCTP_CRC bit from features for esp offload +- net: xfrm: Localize sequence counter per network namespace +- ARM: OMAP4: PM: update ROM return address for OSWR and OFF +- ARM: OMAP4: Fix PMIC voltage domains for bionic +- regulator: bd9571mwv: Fix AVS and DVFS voltage range +- remoteproc: qcom: pil_info: avoid 64-bit division +- xfrm: Use actual socket sk instead of skb socket for xfrm_output_resume +- xfrm: interface: fix ipv4 pmtu check to honor ip header df +- ice: Recognize 860 as iSCSI port in CEE mode +- ice: Refactor DCB related variables out of the ice_port_info struct +- net: sched: fix err handler in tcf_action_init() +- KVM: x86/mmu: preserve pending TLB flush across calls to kvm_tdp_mmu_zap_sp +- KVM: x86/mmu: Don't allow TDP MMU to yield when recovering NX pages +- KVM: x86/mmu: Ensure TLBs are flushed for TDP MMU during NX zapping +- KVM: x86/mmu: Ensure TLBs are flushed when yielding during GFN range zap +- KVM: x86/mmu: Yield in TDU MMU iter even if no SPTES changed +- KVM: x86/mmu: Ensure forward progress when yielding in TDP MMU iter +- KVM: x86/mmu: Rename goal_gfn to next_last_level_gfn +- KVM: x86/mmu: Merge flush and non-flush tdp_mmu_iter_cond_resched +- KVM: x86/mmu: change TDP MMU yield function returns to match cond_resched +- i2c: turn recovery error on init to debug +- percpu: make pcpu_nr_empty_pop_pages per chunk type +- scsi: target: iscsi: Fix zero tag inside a trace event +- scsi: pm80xx: Fix chip initialization failure +- driver core: Fix locking bug in deferred_probe_timeout_work_func() +- usbip: synchronize event handler with sysfs code paths +- usbip: vudc synchronize sysfs code paths +- usbip: stub-dev synchronize sysfs code paths +- usbip: add sysfs_lock to synchronize sysfs code paths +- thunderbolt: Fix off by one in tb_port_find_retimer() +- thunderbolt: Fix a leak in tb_retimer_add() +- net: let skb_orphan_partial wake-up waiters. +- net-ipv6: bugfix - raw & sctp - switch to ipv6_can_nonlocal_bind() +- net: hsr: Reset MAC header for Tx path +- mac80211: fix TXQ AC confusion +- mac80211: fix time-is-after bug in mlme +- cfg80211: check S1G beacon compat element length +- nl80211: fix potential leak of ACL params +- nl80211: fix beacon head validation +- net: sched: fix action overwrite reference counting +- net: sched: sch_teql: fix null-pointer dereference +- vdpa/mlx5: Fix suspend/resume index restoration +- i40e: Fix sparse errors in i40e_txrx.c +- i40e: Fix sparse error: uninitialized symbol 'ring' +- i40e: Fix sparse error: 'vsi->netdev' could be null +- i40e: Fix sparse warning: missing error code 'err' +- net: ensure mac header is set in virtio_net_hdr_to_skb() +- bpf, sockmap: Fix incorrect fwd_alloc accounting +- bpf, sockmap: Fix sk->prot unhash op reset +- bpf: Refcount task stack in bpf_get_task_stack +- libbpf: Only create rx and tx XDP rings when necessary +- libbpf: Restore umem state after socket create failure +- libbpf: Ensure umem pointer is non-NULL before dereferencing +- ethernet/netronome/nfp: Fix a use after free in nfp_bpf_ctrl_msg_rx +- bpf: link: Refuse non-O_RDWR flags in BPF_OBJ_GET +- bpf: Enforce that struct_ops programs be GPL-only +- libbpf: Fix bail out from 'ringbuf_process_ring()' on error +- net: hso: fix null-ptr-deref during tty device unregistration +- ice: fix memory leak of aRFS after resuming from suspend +- iwlwifi: pcie: properly set LTR workarounds on 22000 devices +- ice: Cleanup fltr list in case of allocation issues +- ice: Use port number instead of PF ID for WoL +- ice: Fix for dereference of NULL pointer +- ice: remove DCBNL_DEVRESET bit from PF state +- ice: fix memory allocation call +- ice: prevent ice_open and ice_stop during reset +- ice: Increase control queue timeout +- ice: Continue probe on link/PHY errors +- batman-adv: initialize "struct batadv_tvlv_tt_vlan_data"->reserved field +- ARM: dts: turris-omnia: configure LED[2]/INTn pin as interrupt pin +- parisc: avoid a warning on u8 cast for cmpxchg on u8 pointers +- parisc: parisc-agp requires SBA IOMMU driver +- of: property: fw_devlink: do not link ".*,nr-gpios" +- ethtool: fix incorrect datatype in set_eee ops +- fs: direct-io: fix missing sdio->boundary +- ocfs2: fix deadlock between setattr and dio_end_io_write +- nds32: flush_dcache_page: use page_mapping_file to avoid races with swapoff +- ia64: fix user_stack_pointer() for ptrace() +- gcov: re-fix clang-11+ support +- LOOKUP_MOUNTPOINT: we are cleaning "jumped" flag too late +- IB/hfi1: Fix probe time panic when AIP is enabled with a buggy BIOS +- ACPI: processor: Fix build when CONFIG_ACPI_PROCESSOR=m +- drm/i915: Fix invalid access to ACPI _DSM objects +- net: dsa: lantiq_gswip: Configure all remaining GSWIP_MII_CFG bits +- net: dsa: lantiq_gswip: Don't use PHY auto polling +- net: dsa: lantiq_gswip: Let GSWIP automatically set the xMII clock +- net: ipv6: check for validity before dereferencing cfg->fc_nlinfo.nlh +- xen/evtchn: Change irq_info lock to raw_spinlock_t +- selinux: fix race between old and new sidtab +- selinux: fix cond_list corruption when changing booleans +- selinux: make nslot handling in avtab more robust +- nfc: Avoid endless loops caused by repeated llcp_sock_connect() +- nfc: fix memory leak in llcp_sock_connect() +- nfc: fix refcount leak in llcp_sock_connect() +- nfc: fix refcount leak in llcp_sock_bind() +- ASoC: intel: atom: Stop advertising non working S24LE support +- ALSA: hda/conexant: Apply quirk for another HP ZBook G5 model +- ALSA: hda/realtek: Fix speaker amp setup on Acer Aspire E1 +- ALSA: aloop: Fix initialization of controls +- xfrm/compat: Cleanup WARN()s that can be user-triggered +- arm64: fix USER_DS definition problem in non-compat mode +- init/Kconfig: make COMPILE_TEST depend on HAS_IOMEM +- init/Kconfig: make COMPILE_TEST depend on !S390 +- bpf, x86: Validate computation of branch displacements for x86-32 +- bpf, x86: Validate computation of branch displacements for x86-64 +- tools/resolve_btfids: Add /libbpf to .gitignore +- kbuild: Do not clean resolve_btfids if the output does not exist +- kbuild: Add resolve_btfids clean to root clean target +- tools/resolve_btfids: Set srctree variable unconditionally +- tools/resolve_btfids: Check objects before removing +- tools/resolve_btfids: Build libbpf and libsubcmd in separate directories +- math: Export mul_u64_u64_div_u64 +- io_uring: fix timeout cancel return code +- cifs: Silently ignore unknown oplock break handle +- cifs: revalidate mapping when we open files for SMB1 POSIX +- ia64: fix format strings for err_inject +- ia64: mca: allocate early mca with GFP_ATOMIC +- selftests/vm: fix out-of-tree build +- scsi: target: pscsi: Clean up after failure in pscsi_map_sg() +- ptp_qoriq: fix overflow in ptp_qoriq_adjfine() u64 calcalation +- platform/x86: intel_pmc_core: Ignore GBE LTR on Tiger Lake platforms +- block: clear GD_NEED_PART_SCAN later in bdev_disk_changed +- x86/build: Turn off -fcf-protection for realmode targets +- drm/msm/disp/dpu1: icc path needs to be set before dpu runtime resume +- kselftest/arm64: sve: Do not use non-canonical FFR register value +- platform/x86: thinkpad_acpi: Allow the FnLock LED to change state +- net: ipa: fix init header command validation +- netfilter: nftables: skip hook overlap logic if flowtable is stale +- netfilter: conntrack: Fix gre tunneling over ipv6 +- drm/msm: Ratelimit invalid-fence message +- drm/msm/adreno: a5xx_power: Don't apply A540 lm_setup to other GPUs +- drm/msm/dsi_pll_7nm: Fix variable usage for pll_lockdet_rate +- mac80211: choose first enabled channel for monitor +- mac80211: Check crypto_aead_encrypt for errors +- mISDN: fix crash in fritzpci +- kunit: tool: Fix a python tuple typing error +- net: pxa168_eth: Fix a potential data race in pxa168_eth_remove +- net/mlx5e: Enforce minimum value check for ICOSQ size +- bpf, x86: Use kvmalloc_array instead kmalloc_array in bpf_jit_comp +- platform/x86: intel-hid: Support Lenovo ThinkPad X1 Tablet Gen 2 +- bus: ti-sysc: Fix warning on unbind if reset is not deasserted +- ARM: dts: am33xx: add aliases for mmc interfaces +- bpf: Use NOP_ATOMIC5 instead of emit_nops(&prog, 5) for BPF_TRAMP_F_CALL_ORIG +- Revert "kernel: freezer should treat PF_IO_WORKER like PF_KTHREAD for freezing" +- riscv: evaluate put_user() arg before enabling user access +- drivers: video: fbcon: fix NULL dereference in fbcon_cursor() +- driver core: clear deferred probe reason on probe retry +- staging: rtl8192e: Change state information from u16 to u8 +- staging: rtl8192e: Fix incorrect source in memcpy() +- soc: qcom-geni-se: Cleanup the code to remove proxy votes +- usb: dwc3: gadget: Clear DEP flags after stop transfers in ep disable +- usb: dwc3: qcom: skip interconnect init for ACPI probe +- usb: dwc2: Prevent core suspend when port connection flag is 0 +- usb: dwc2: Fix HPRT0.PrtSusp bit setting for HiKey 960 board. +- usb: gadget: udc: amd5536udc_pci fix null-ptr-dereference +- USB: cdc-acm: fix use-after-free after probe failure +- USB: cdc-acm: fix double free on probe failure +- USB: cdc-acm: downgrade message to debug +- USB: cdc-acm: untangle a circular dependency between callback and softint +- cdc-acm: fix BREAK rx code path adding necessary calls +- usb: xhci-mtk: fix broken streams issue on 0.96 xHCI +- usb: musb: Fix suspend with devices connected for a64 +- USB: quirks: ignore remote wake-up on Fibocom L850-GL LTE modem +- usbip: vhci_hcd fix shift out-of-bounds in vhci_hub_control() +- firewire: nosy: Fix a use-after-free bug in nosy_ioctl() +- video: hyperv_fb: Fix a double free in hvfb_probe +- usb: dwc3: pci: Enable dis_uX_susphy_quirk for Intel Merrifield +- firmware: stratix10-svc: reset COMMAND_RECONFIG_FLAG_PARTIAL to 0 +- extcon: Fix error handling in extcon_dev_register +- extcon: Add stubs for extcon_register_notifier_all() functions +- pinctrl: rockchip: fix restore error in resume +- vfio/nvlink: Add missing SPAPR_TCE_IOMMU depends +- drm/tegra: sor: Grab runtime PM reference across reset +- drm/tegra: dc: Restore coupling of display controllers +- drm/imx: fix memory leak when fails to init +- reiserfs: update reiserfs_xattrs_initialized() condition +- drm/amdgpu: check alignment on CPU page for bo map +- drm/amdgpu: fix offset calculation in amdgpu_vm_bo_clear_mappings() +- drm/amdkfd: dqm fence memory corruption +- mm: fix race by making init_zero_pfn() early_initcall +- s390/vdso: fix tod_steering_delta type +- s390/vdso: copy tod_steering_delta value to vdso_data page +- tracing: Fix stack trace event size +- PM: runtime: Fix ordering in pm_runtime_get_suppliers() +- PM: runtime: Fix race getting/putting suppliers at probe +- KVM: SVM: ensure that EFER.SVME is set when running nested guest or on nested vmexit +- KVM: SVM: load control fields from VMCB12 before checking them +- xtensa: move coprocessor_flush to the .text section +- xtensa: fix uaccess-related livelock in do_page_fault +- ALSA: hda/realtek: fix mute/micmute LEDs for HP 640 G8 +- ALSA: hda/realtek: call alc_update_headset_mode() in hp_automute_hook +- ALSA: hda/realtek: fix a determine_headset_type issue for a Dell AIO +- ALSA: hda: Add missing sanity checks in PM prepare/complete callbacks +- ALSA: hda: Re-add dropped snd_poewr_change_state() calls +- ALSA: usb-audio: Apply sample rate quirk to Logitech Connect +- ACPI: processor: Fix CPU0 wakeup in acpi_idle_play_dead() +- ACPI: tables: x86: Reserve memory occupied by ACPI tables +- bpf: Remove MTU check in __bpf_skb_max_len +- net: 9p: advance iov on empty read +- net: wan/lmc: unregister device when no matching device is found +- net: ipa: fix register write command validation +- net: ipa: remove two unused register definitions +- appletalk: Fix skb allocation size in loopback case +- net: ethernet: aquantia: Handle error cleanup of start on open +- ath10k: hold RCU lock when calling ieee80211_find_sta_by_ifaddr() +- iwlwifi: pcie: don't disable interrupts for reg_lock +- netdevsim: dev: Initialize FIB module after debugfs +- rtw88: coex: 8821c: correct antenna switch function +- ath11k: add ieee80211_unregister_hw to avoid kernel crash caused by NULL pointer +- brcmfmac: clear EAP/association status bits on linkdown events +- can: tcan4x5x: fix max register value +- net: introduce CAN specific pointer in the struct net_device +- can: dev: move driver related infrastructure into separate subdir +- flow_dissector: fix TTL and TOS dissection on IPv4 fragments +- net: mvpp2: fix interrupt mask/unmask skip condition +- io_uring: call req_set_fail_links() on short send[msg]()/recv[msg]() with MSG_WAITALL +- ext4: do not iput inode under running transaction in ext4_rename() +- static_call: Align static_call_is_init() patching condition +- io_uring: imply MSG_NOSIGNAL for send[msg]()/recv[msg]() calls +- nvmet-tcp: fix kmap leak when data digest in use +- locking/ww_mutex: Fix acquire/release imbalance in ww_acquire_init()/ww_acquire_fini() +- locking/ww_mutex: Simplify use_ww_ctx & ww_ctx handling +- thermal/core: Add NULL pointer check before using cooling device stats +- ASoC: rt711: add snd_soc_component remove callback +- ASoC: rt5659: Update MCLK rate in set_sysclk() +- staging: comedi: cb_pcidas64: fix request_irq() warn +- staging: comedi: cb_pcidas: fix request_irq() warn +- scsi: qla2xxx: Fix broken #endif placement +- scsi: st: Fix a use after free in st_open() +- io_uring: fix ->flags races by linked timeouts +- vhost: Fix vhost_vq_reset() +- kernel: freezer should treat PF_IO_WORKER like PF_KTHREAD for freezing +- NFSD: fix error handling in NFSv4.0 callbacks +- ASoC: cs42l42: Always wait at least 3ms after reset +- ASoC: cs42l42: Fix mixer volume control +- ASoC: cs42l42: Fix channel width support +- ASoC: cs42l42: Fix Bitclock polarity inversion +- ASoC: soc-core: Prevent warning if no DMI table is present +- ASoC: es8316: Simplify adc_pga_gain_tlv table +- ASoC: sgtl5000: set DAP_AVC_CTRL register to correct default value on probe +- ASoC: rt5651: Fix dac- and adc- vol-tlv values being off by a factor of 10 +- ASoC: rt5640: Fix dac- and adc- vol-tlv values being off by a factor of 10 +- ASoC: rt1015: fix i2c communication error +- iomap: Fix negative assignment to unsigned sis->pages in iomap_swapfile_activate +- rpc: fix NULL dereference on kmalloc failure +- fs: nfsd: fix kconfig dependency warning for NFSD_V4 +- ext4: fix bh ref count on error paths +- ext4: shrink race window in ext4_should_retry_alloc() +- virtiofs: Fail dax mount if device does not support it +- bpf: Fix fexit trampoline. +- arm64: mm: correct the inside linear map range during hotplug check +- io_uring: convert io_buffer_idr to XArray +- io_uring: Convert personality_idr to XArray +- io_uring: simplify io_remove_personalities() +- posix-timers: Preserve return value in clock_adjtime32() +- arm64: fix current_thread_info()->addr_limit setup +- xen-blkback: don't leak persistent grants from xen_blkbk_map() +- can: peak_usb: Revert "can: peak_usb: add forgotten supported devices" +- nvme: fix the nsid value to print in nvme_validate_or_alloc_ns +- Revert "net: bonding: fix error return code of bond_neigh_init()" +- Revert "xen: fix p2m size in dom0 for disabled memory hotplug case" +- fs/ext4: fix integer overflow in s_log_groups_per_flex +- ext4: add reclaim checks to xattr code +- mac80211: fix double free in ibss_leave +- net: dsa: b53: VLAN filtering is global to all users +- r8169: fix DMA being used after buffer free if WoL is enabled +- can: dev: Move device back to init netns on owning netns delete +- ch_ktls: fix enum-conversion warning +- fs/cachefiles: Remove wait_bit_key layout dependency +- mm/memcg: fix 5.10 backport of splitting page memcg +- x86/mem_encrypt: Correct physical address calculation in __set_clr_pte_enc() +- locking/mutex: Fix non debug version of mutex_lock_io_nested() +- cifs: Adjust key sizes and key generation routines for AES256 encryption +- smb3: fix cached file size problems in duplicate extents (reflink) +- scsi: mpt3sas: Fix error return code of mpt3sas_base_attach() +- scsi: qedi: Fix error return code of qedi_alloc_global_queues() +- scsi: Revert "qla2xxx: Make sure that aborted commands are freed" +- block: recalculate segment count for multi-segment discards correctly +- io_uring: fix provide_buffers sign extension +- perf synthetic events: Avoid write of uninitialized memory when generating PERF_RECORD_MMAP* records +- perf auxtrace: Fix auxtrace queue conflict +- ACPI: scan: Use unique number for instance_no +- ACPI: scan: Rearrange memory allocation in acpi_device_add() +- Revert "netfilter: x_tables: Update remaining dereference to RCU" +- mm/mmu_notifiers: ensure range_end() is paired with range_start() +- dm table: Fix zoned model check and zone sectors check +- netfilter: x_tables: Use correct memory barriers. +- Revert "netfilter: x_tables: Switch synchronization to RCU" +- net: phy: broadcom: Fix RGMII delays for BCM50160 and BCM50610M +- net: phy: broadcom: Set proper 1000BaseX/SGMII interface mode for BCM54616S +- net: phy: broadcom: Avoid forward for bcm54xx_config_clock_delay() +- net: phy: introduce phydev->port +- net: axienet: Fix probe error cleanup +- net: axienet: Properly handle PCS/PMA PHY for 1000BaseX mode +- igb: avoid premature Rx buffer reuse +- net, bpf: Fix ip6ip6 crash with collect_md populated skbs +- net: Consolidate common blackhole dst ops +- bpf: Don't do bpf_cgroup_storage_set() for kuprobe/tp programs +- RDMA/cxgb4: Fix adapter LE hash errors while destroying ipv6 listening server +- xen/x86: make XEN_BALLOON_MEMORY_HOTPLUG_LIMIT depend on MEMORY_HOTPLUG +- octeontx2-af: Fix memory leak of object buf +- net: bridge: don't notify switchdev for local FDB addresses +- PM: EM: postpone creating the debugfs dir till fs_initcall +- net/mlx5e: Fix error path for ethtool set-priv-flag +- net/mlx5e: Offload tuple rewrite for non-CT flows +- net/mlx5e: Allow to match on MPLS parameters only for MPLS over UDP +- net/mlx5: Add back multicast stats for uplink representor +- PM: runtime: Defer suspending suppliers +- arm64: kdump: update ppos when reading elfcorehdr +- drm/msm: Fix suspend/resume on i.MX5 +- drm/msm: fix shutdown hook in case GPU components failed to bind +- can: isotp: tx-path: zero initialize outgoing CAN frames +- bpf: Fix umd memory leak in copy_process() +- libbpf: Fix BTF dump of pointer-to-array-of-struct +- selftests: forwarding: vxlan_bridge_1d: Fix vxlan ecn decapsulate value +- selinux: vsock: Set SID for socket returned by accept() +- net: stmmac: dwmac-sun8i: Provide TX and RX fifo sizes +- r8152: limit the RX buffer size of RTL8153A for USB 2.0 +- igb: check timestamp validity +- net: cdc-phonet: fix data-interface release on probe failure +- net: check all name nodes in __dev_alloc_name +- octeontx2-af: fix infinite loop in unmapping NPC counter +- octeontx2-pf: Clear RSS enable flag on interace down +- octeontx2-af: Fix irq free in rvu teardown +- octeontx2-af: Remove TOS field from MKEX TX +- octeontx2-af: Modify default KEX profile to extract TX packet fields +- octeontx2-af: Formatting debugfs entry rsrc_alloc. +- ipv6: weaken the v4mapped source check +- ARM: dts: imx6ull: fix ubi filesystem mount failed +- libbpf: Use SOCK_CLOEXEC when opening the netlink socket +- libbpf: Fix error path in bpf_object__elf_init() +- netfilter: flowtable: Make sure GC works periodically in idle system +- netfilter: nftables: allow to update flowtable flags +- netfilter: nftables: report EOPNOTSUPP on unsupported flowtable flags +- net/sched: cls_flower: fix only mask bit check in the validate_ct_state +- ionic: linearize tso skb with too many frags +- drm/msm/dsi: fix check-before-set in the 7nm dsi_pll code +- ftrace: Fix modify_ftrace_direct. +- nfp: flower: fix pre_tun mask id allocation +- nfp: flower: add ipv6 bit to pre_tunnel control message +- nfp: flower: fix unsupported pre_tunnel flows +- selftests/net: fix warnings on reuseaddr_ports_exhausted +- mac80211: Allow HE operation to be longer than expected. +- mac80211: fix rate mask reset +- can: m_can: m_can_rx_peripheral(): fix RX being blocked by errors +- can: m_can: m_can_do_rx_poll(): fix extraneous msg loss warning +- can: c_can: move runtime PM enable/disable to c_can_platform +- can: c_can_pci: c_can_pci_remove(): fix use-after-free +- can: kvaser_pciefd: Always disable bus load reporting +- can: flexcan: flexcan_chip_freeze(): fix chip freeze for missing bitrate +- can: peak_usb: add forgotten supported devices +- can: isotp: TX-path: ensure that CAN frame flags are initialized +- can: isotp: isotp_setsockopt(): only allow to set low level TX flags for CAN-FD +- tcp: relookup sock for RST+ACK packets handled by obsolete req sock +- tipc: better validate user input in tipc_nl_retrieve_key() +- net: phylink: Fix phylink_err() function name error in phylink_major_config +- net: hdlc_x25: Prevent racing between "x25_close" and "x25_xmit"/"x25_rx" +- netfilter: ctnetlink: fix dump of the expect mask attribute +- selftests/bpf: Set gopt opt_class to 0 if get tunnel opt failed +- flow_dissector: fix byteorder of dissected ICMP ID +- net: qrtr: fix a kernel-infoleak in qrtr_recvmsg() +- net: ipa: terminate message handler arrays +- clk: qcom: gcc-sc7180: Use floor ops for the correct sdcc1 clk +- ftgmac100: Restart MAC HW once +- net: phy: broadcom: Add power down exit reset state delay +- net/qlcnic: Fix a use after free in qlcnic_83xx_get_minidump_template +- e1000e: Fix error handling in e1000_set_d0_lplu_state_82571 +- e1000e: add rtnl_lock() to e1000_reset_task +- igc: Fix igc_ptp_rx_pktstamp() +- igc: Fix Supported Pause Frame Link Setting +- igc: Fix Pause Frame Advertising +- igc: reinit_locked() should be called with rtnl_lock +- net: dsa: bcm_sf2: Qualify phydev->dev_flags based on port +- net: sched: validate stab values +- macvlan: macvlan_count_rx() needs to be aware of preemption +- drop_monitor: Perform cleanup upon probe registration failure +- ipv6: fix suspecious RCU usage warning +- net/mlx5e: Don't match on Geneve options in case option masks are all zero +- net/mlx5e: When changing XDP program without reset, take refs for XSK RQs +- net/mlx5e: RX, Mind the MPWQE gaps when calculating offsets +- libbpf: Fix INSTALL flag order +- bpf: Change inode_storage's lookup_elem return value from NULL to -EBADF +- veth: Store queue_mapping independently of XDP prog presence +- soc: ti: omap-prm: Fix occasional abort on reset deassert for dra7 iva +- ARM: OMAP2+: Fix smartreflex init regression after dropping legacy data +- bus: omap_l3_noc: mark l3 irqs as IRQF_NO_THREAD +- dm ioctl: fix out of bounds array access when no devices +- dm verity: fix DM_VERITY_OPTS_MAX value +- drm/i915: Fix the GT fence revocation runtime PM logic +- drm/amdgpu: Add additional Sienna Cichlid PCI ID +- drm/amdgpu/display: restore AUX_DPHY_TX_CONTROL for DCN2.x +- drm/amd/pm: workaround for audio noise issue +- drm/etnaviv: Use FOLL_FORCE for userptr +- integrity: double check iint_cache was initialized +- ARM: dts: at91-sama5d27_som1: fix phy address to 7 +- ARM: dts: at91: sam9x60: fix mux-mask to match product's datasheet +- ARM: dts: at91: sam9x60: fix mux-mask for PA7 so it can be set to A, B and C +- arm64: dts: ls1043a: mark crypto engine dma coherent +- arm64: dts: ls1012a: mark crypto engine dma coherent +- arm64: dts: ls1046a: mark crypto engine dma coherent +- arm64: stacktrace: don't trace arch_stack_walk() +- ACPICA: Always create namespace nodes using acpi_ns_create_node() +- ACPI: video: Add missing callback back for Sony VPCEH3U1E +- gcov: fix clang-11+ support +- kasan: fix per-page tags for non-page_alloc pages +- hugetlb_cgroup: fix imbalanced css_get and css_put pair for shared mappings +- squashfs: fix xattr id and id lookup sanity checks +- squashfs: fix inode lookup sanity checks +- z3fold: prevent reclaim/free race for headless pages +- psample: Fix user API breakage +- platform/x86: intel-vbtn: Stop reporting SW_DOCK events +- netsec: restore phy power state after controller reset +- selinux: fix variable scope issue in live sidtab conversion +- selinux: don't log MAC_POLICY_LOAD record on failed policy load +- btrfs: fix sleep while in non-sleep context during qgroup removal +- KVM: x86: Protect userspace MSR filter with SRCU, and set atomically-ish +- static_call: Fix static_call_set_init() +- static_call: Fix the module key fixup +- static_call: Allow module use without exposing static_call_key +- static_call: Pull some static_call declarations to the type headers +- ia64: fix ptrace(PTRACE_SYSCALL_INFO_EXIT) sign +- ia64: fix ia64_syscall_get_set_arguments() for break-based syscalls +- mm/fork: clear PASID for new mm +- block: Suppress uevent for hidden device when removed +- nfs: we don't support removing system.nfs4_acl +- nvme-pci: add the DISABLE_WRITE_ZEROES quirk for a Samsung PM1725a +- nvme-rdma: Fix a use after free in nvmet_rdma_write_data_done +- nvme-core: check ctrl css before setting up zns +- nvme-fc: return NVME_SC_HOST_ABORTED_CMD when a command has been aborted +- nvme-fc: set NVME_REQ_CANCELLED in nvme_fc_terminate_exchange() +- nvme: add NVME_REQ_CANCELLED flag in nvme_cancel_request() +- nvme: simplify error logic in nvme_validate_ns() +- drm/radeon: fix AGP dependency +- drm/amdgpu: fb BO should be ttm_bo_type_device +- drm/amd/display: Revert dram_clock_change_latency for DCN2.1 +- block: Fix REQ_OP_ZONE_RESET_ALL handling +- regulator: qcom-rpmh: Correct the pmic5_hfsmps515 buck +- kselftest: arm64: Fix exit code of sve-ptrace +- u64_stats,lockdep: Fix u64_stats_init() vs lockdep +- staging: rtl8192e: fix kconfig dependency on CRYPTO +- habanalabs: Call put_pid() when releasing control device +- sparc64: Fix opcode filtering in handling of no fault loads +- umem: fix error return code in mm_pci_probe() +- kbuild: dummy-tools: fix inverted tests for gcc +- kbuild: add image_name to no-sync-config-targets +- irqchip/ingenic: Add support for the JZ4760 +- cifs: change noisy error message to FYI +- atm: idt77252: fix null-ptr-dereference +- atm: uPD98402: fix incorrect allocation +- net: enetc: set MAC RX FIFO to recommended value +- net: davicom: Use platform_get_irq_optional() +- net: wan: fix error return code of uhdlc_init() +- net: hisilicon: hns: fix error return code of hns_nic_clear_all_rx_fetch() +- NFS: Correct size calculation for create reply length +- nfs: fix PNFS_FLEXFILE_LAYOUT Kconfig default +- gpiolib: acpi: Add missing IRQF_ONESHOT +- cpufreq: blacklist Arm Vexpress platforms in cpufreq-dt-platdev +- gfs2: fix use-after-free in trans_drain +- cifs: ask for more credit on async read/write code paths +- gianfar: fix jumbo packets+napi+rx overrun crash +- sun/niu: fix wrong RXMAC_BC_FRM_CNT_COUNT count +- net: intel: iavf: fix error return code of iavf_init_get_resources() +- net: tehuti: fix error return code in bdx_probe() +- blk-cgroup: Fix the recursive blkg rwstat +- scsi: ufs: ufs-qcom: Disable interrupt in reset path +- ixgbe: Fix memleak in ixgbe_configure_clsu32 +- ALSA: hda: ignore invalid NHLT table +- Revert "r8152: adjust the settings about MAC clock speed down for RTL8153" +- atm: lanai: dont run lanai_dev_close if not open +- atm: eni: dont release is never initialized +- powerpc/4xx: Fix build errors from mfdcr() +- net: fec: ptp: avoid register access when ipg clock is disabled +- net: stmmac: fix dma physical address of descriptor when display ring +- mt76: fix tx skb error handling in mt76_dma_tx_queue_skb +- mm/memcg: set memcg when splitting page +- mm/memcg: rename mem_cgroup_split_huge_fixup to split_page_memcg and add nr_pages argument +- kvm: debugfs: add EXIT_REASON_PREEMPTION_TIMER to vcpu_stat +- kvm: debugfs: add fastpath msr_wr exits to debugfs statistics +- arm64/mpam: fix a possible deadlock in mpam_enable +- RDMA/hns: Optimize the base address table config for MTR +- fs: fix files.usage bug when move tasks +- files_cgroup: fix error pointer when kvm_vm_worker_thread +- fs/filescontrol: add a switch to enable / disable accounting of open fds +- cgroup/files: use task_get_css() to get a valid css during dup_fd() +- cgroups: Resource controller for open files +- openeuler_defconfig: enable CONFIG_CGROUP_FILES by default +- x86: config: disable CONFIG_BOOTPARAM_HOTPLUG_CPU0 by default +- ima: fix a memory leak in ima_del_digest_data_entry +- config: add digest list options for arm64 and x86 +- evm: Propagate choice of HMAC algorithm in evm_crypto.c +- evm: Extend evm= with x509. allow_metadata_writes and complete values +- ima: Execute parser to upload digest lists not recognizable by the kernel +- ima: Add parser keyword to the policy +- ima: Allow direct upload of digest lists to securityfs +- ima: Search key in the built-in keyrings +- certs: Introduce search_trusted_key() +- KEYS: Introduce load_pgp_public_keyring() +- KEYS: Provide a function to load keys from a PGP keyring blob +- KEYS: Provide PGP key description autogeneration +- KEYS: PGP data parser +- PGPLIB: Basic packet parser +- PGPLIB: PGP definitions (RFC 4880) +- rsa: add parser of raw format +- mpi: introduce mpi_key_length() +- evm: Reset status even when security.evm is modified +- ima: Add Documentation/security/IMA-digest-lists.txt +- ima: Introduce appraise_exec_immutable policy +- ima: Introduce appraise_exec_tcb policy +- ima: Introduce exec_tcb policy +- ima: Add meta_immutable appraisal type +- evm: Add support for digest lists of metadata +- ima: Add support for appraisal with digest lists +- ima: Add support for measurement with digest lists +- ima: Load all digest lists from a directory at boot time +- ima: Introduce new hook DIGEST_LIST_CHECK +- ima: Introduce new securityfs files +- ima: Prevent usage of digest lists not measured or appraised +- ima: Add parser of compact digest list +- ima: Use ima_show_htable_value to show violations and hash table data +- ima: Generalize policy file operations +- ima: Generalize ima_write_policy() and raise uploaded data size limit +- ima: Generalize ima_read_policy() +- ima: Allow choice of file hash algorithm for measurement and audit +- ima: Add enforce-evm and log-evm modes to strictly check EVM status +- init: Add kernel option to force usage of tmpfs for rootfs +- gen_init_cpio: add support for file metadata +- initramfs: read metadata from special file METADATA!!! +- initramfs: add file metadata +- ima: Don't remove security.ima if file must not be appraised +- ima: Introduce template field evmsig and write to field sig as fallback +- ima: Allow imasig requirement to be satisfied by EVM portable signatures +- evm: Allow setxattr() and setattr() for unmodified metadata +- evm: Allow xattr/attr operations for portable signatures +- evm: Ignore INTEGRITY_NOLABEL/INTEGRITY_NOXATTRS if conditions are safe +- evm: Introduce evm_status_revalidate() +- ima: Move ima_reset_appraise_flags() call to post hooks +- evm: Refuse EVM_ALLOW_METADATA_WRITES only if an HMAC key is loaded +- evm: Load EVM key in ima_load_x509() to avoid appraisal +- evm: Execute evm_inode_init_security() only when an HMAC key is loaded +- cgroup: disable kernel memory accounting for all memory cgroups by default +- etmem: Modify the memig feature name to etmem +- memig: fix compile error when CONFIG_NUMA is turned off +- memig: add memig-swap feature to openEuler +- memig: add memig-scan feature to openEuler +- arm64: fix compile error when CONFIG_ACPI is not enabled +- arm64: ipi_nmi: fix compile error when CONFIG_KGDB is disabled +- arm64: kgdb: Roundup cpus using IPI as NMI +- kgdb: Expose default CPUs roundup fallback mechanism +- arm64: ipi_nmi: Add support for NMI backtrace +- nmi: backtrace: Allow runtime arch specific override +- arm64: smp: Assign and setup an IPI as NMI +- irqchip/gic-v3: Enable support for SGIs to act as NMIs +- arm64: Add framework to turn IPI as NMI +- openeuler_defconfig: Enable NMI watchdog +- arm64: watchdog: add switch to select sdei_watchdog/pmu_watchdog +- arm64: add new config CONFIG_PMU_WATCHDOG +- arm64: Add support for hard lockup by using pmu counter +- config: enable CONFIG_CPU_IDLE_GOV_HALTPOLL and CONFIG_HALTPOLL_CPUIDLE for arm +- ARM: cpuidle: Add support for cpuidle-haltpoll driver for ARM +- cpuidle: haltpoll: Only check boot_option_idle_override in x86 +- arm64: Add some definitions of kvm_para* +- cpuidle-haltpoll: Use arch_cpu_idle() to replace default_idle() +- arm64: Optimize ttwu IPI +- kvm: arm64: add KVM_CAP_ARM_CPU_FEATURE extension +- kvm: arm64: make ID_AA64PFR0_EL1 configurable +- kvm: arm64: make ID registers configurable +- kvm: arm64: emulate the ID registers +- arm64: add a helper function to traverse arm64_ftr_regs +- KVM: arm64: Add tracepoints for PV qspinlock +- KVM: arm64: Enable PV qspinlock +- KVM: arm64: Add interface to support PV qspinlock +- KVM: arm64: Implement PV_SCHED_KICK_CPU call +- KVM: arm64: Add SMCCC PV-sched to kick cpu +- KVM: arm64: Support the vCPU preemption check +- KVM: arm64: Add interface to support vCPU preempted check +- KVM: arm64: Support pvsched preempted via shared structure +- KVM: arm64: Implement PV_SCHED_FEATURES call +- KVM: arm64: Document PV-sched interface +- arm64: fix the compile error when CONFIG_NUMA is disabled +- arm64: Add CPU hotplug support +- arm64: mark all the GICC nodes in MADT as possible cpu +- loop: fix I/O error on fsync() in detached loop devices +- sysrq: avoid concurrently info printing by 'sysrq-trigger' +- jffs2: check the validity of dstlen in jffs2_zlib_compress() +- cifs: Fix preauth hash corruption +- x86/apic/of: Fix CPU devicetree-node lookups +- genirq: Disable interrupts for force threaded handlers +- firmware/efi: Fix a use after bug in efi_mem_reserve_persistent +- efi: use 32-bit alignment for efi_guid_t literals +- static_call: Fix static_call_update() sanity check +- MAINTAINERS: move the staging subsystem to lists.linux.dev +- MAINTAINERS: move some real subsystems off of the staging mailing list +- ext4: fix rename whiteout with fast commit +- ext4: fix potential error in ext4_do_update_inode +- ext4: do not try to set xattr into ea_inode if value is empty +- ext4: stop inode update before return +- ext4: fix error handling in ext4_end_enable_verity() +- efivars: respect EFI_UNSUPPORTED return from firmware +- x86: Introduce TS_COMPAT_RESTART to fix get_nr_restart_syscall() +- x86: Move TS_COMPAT back to asm/thread_info.h +- kernel, fs: Introduce and use set_restart_fn() and arch_set_restart_data() +- x86/ioapic: Ignore IRQ2 again +- perf/x86/intel: Fix unchecked MSR access error caused by VLBR_EVENT +- perf/x86/intel: Fix a crash caused by zero PEBS status +- PCI: rpadlpar: Fix potential drc_name corruption in store functions +- counter: stm32-timer-cnt: fix ceiling miss-alignment with reload register +- counter: stm32-timer-cnt: fix ceiling write max value +- iio: hid-sensor-temperature: Fix issues of timestamp channel +- iio: hid-sensor-prox: Fix scale not correct issue +- iio: hid-sensor-humidity: Fix alignment issue of timestamp channel +- iio: adc: adi-axi-adc: add proper Kconfig dependencies +- iio: adc: ad7949: fix wrong ADC result due to incorrect bit mask +- iio: adc: ab8500-gpadc: Fix off by 10 to 3 +- iio: gyro: mpu3050: Fix error handling in mpu3050_trigger_handler +- iio: adis16400: Fix an error code in adis16400_initial_setup() +- iio:adc:qcom-spmi-vadc: add default scale to LR_MUX2_BAT_ID channel +- iio:adc:stm32-adc: Add HAS_IOMEM dependency +- thunderbolt: Increase runtime PM reference count on DP tunnel discovery +- thunderbolt: Initialize HopID IDAs in tb_switch_alloc() +- usb: dwc3: gadget: Prevent EP queuing while stopping transfers +- usb: dwc3: gadget: Allow runtime suspend if UDC unbinded +- usb: typec: tcpm: Invoke power_supply_changed for tcpm-source-psy- +- usb: typec: Remove vdo[3] part of tps6598x_rx_identity_reg struct +- usb: gadget: configfs: Fix KASAN use-after-free +- usbip: Fix incorrect double assignment to udc->ud.tcp_rx +- usb-storage: Add quirk to defeat Kindle's automatic unload +- powerpc: Force inlining of cpu_has_feature() to avoid build failure +- gfs2: bypass signal_our_withdraw if no journal +- gfs2: move freeze glock outside the make_fs_rw and _ro functions +- gfs2: Add common helper for holding and releasing the freeze glock +- regulator: pca9450: Clear PRESET_EN bit to fix BUCK1/2/3 voltage setting +- regulator: pca9450: Enable system reset on WDOG_B assertion +- regulator: pca9450: Add SD_VSEL GPIO for LDO5 +- net: bonding: fix error return code of bond_neigh_init() +- io_uring: clear IOCB_WAITQ for non -EIOCBQUEUED return +- io_uring: don't attempt IO reissue from the ring exit path +- drm/amd/pm: fulfill the Polaris implementation for get_clock_by_type_with_latency() +- s390/qeth: schedule TX NAPI on QAOB completion +- ibmvnic: remove excessive irqsave +- media: cedrus: h264: Support profile controls +- io_uring: fix inconsistent lock state +- iwlwifi: Add a new card for MA family +- drm/amd/display: turn DPMS off on connector unplug +- MIPS: compressed: fix build with enabled UBSAN +- net: phy: micrel: set soft_reset callback to genphy_soft_reset for KSZ8081 +- i40e: Fix endianness conversions +- powerpc/sstep: Fix darn emulation +- powerpc/sstep: Fix load-store and update emulation +- RDMA/mlx5: Allow creating all QPs even when non RDMA profile is used +- scsi: isci: Pass gfp_t flags in isci_port_bc_change_received() +- scsi: isci: Pass gfp_t flags in isci_port_link_up() +- scsi: isci: Pass gfp_t flags in isci_port_link_down() +- scsi: mvsas: Pass gfp_t flags to libsas event notifiers +- scsi: libsas: Introduce a _gfp() variant of event notifiers +- scsi: libsas: Remove notifier indirection +- scsi: pm8001: Neaten debug logging macros and uses +- scsi: pm80xx: Fix pm8001_mpi_get_nvmd_resp() race condition +- scsi: pm80xx: Make running_req atomic +- scsi: pm80xx: Make mpi_build_cmd locking consistent +- module: harden ELF info handling +- module: avoid *goto*s in module_sig_check() +- module: merge repetitive strings in module_sig_check() +- RDMA/rtrs: Fix KASAN: stack-out-of-bounds bug +- RDMA/rtrs: Introduce rtrs_post_send +- RDMA/rtrs-srv: Jump to dereg_mr label if allocate iu fails +- RDMA/rtrs: Remove unnecessary argument dir of rtrs_iu_free +- bpf: Declare __bpf_free_used_maps() unconditionally +- serial: stm32: fix DMA initialization error handling +- tty: serial: stm32-usart: Remove set but unused 'cookie' variables +- ibmvnic: serialize access to work queue on remove +- ibmvnic: add some debugs +- nvme-rdma: fix possible hang when failing to set io queues +- gpiolib: Assign fwnode to parent's if no primary one provided +- counter: stm32-timer-cnt: Report count function when SLAVE_MODE_DISABLED +- RISC-V: correct enum sbi_ext_rfence_fid +- scsi: ufs: ufs-mediatek: Correct operator & -> && +- scsi: myrs: Fix a double free in myrs_cleanup() +- scsi: lpfc: Fix some error codes in debugfs +- riscv: Correct SPARSEMEM configuration +- cifs: fix allocation size on newly created files +- kbuild: Fix for empty SUBLEVEL or PATCHLEVEL again +- net/qrtr: fix __netdev_alloc_skb call +- io_uring: ensure that SQPOLL thread is started for exit +- pstore: Fix warning in pstore_kill_sb() +- i915/perf: Start hrtimer only if sampling the OA buffer +- sunrpc: fix refcount leak for rpc auth modules +- vhost_vdpa: fix the missing irq_bypass_unregister_producer() invocation +- vfio: IOMMU_API should be selected +- svcrdma: disable timeouts on rdma backchannel +- NFSD: fix dest to src mount in inter-server COPY +- NFSD: Repair misuse of sv_lock in 5.10.16-rt30. +- nfsd: don't abort copies early +- nfsd: Don't keep looking up unhashed files in the nfsd file cache +- nvmet: don't check iosqes,iocqes for discovery controllers +- nvme-tcp: fix a NULL deref when receiving a 0-length r2t PDU +- nvme-tcp: fix possible hang when failing to set io queues +- nvme-tcp: fix misuse of __smp_processor_id with preemption enabled +- nvme: fix Write Zeroes limitations +- ALSA: usb-audio: Fix unintentional sign extension issue +- afs: Stop listxattr() from listing "afs.*" attributes +- afs: Fix accessing YFS xattrs on a non-YFS server +- ASoC: simple-card-utils: Do not handle device clock +- ASoC: qcom: lpass-cpu: Fix lpass dai ids parse +- ASoC: codecs: wcd934x: add a sanity check in set channel map +- ASoC: qcom: sdm845: Fix array out of range on rx slim channels +- ASoC: qcom: sdm845: Fix array out of bounds access +- ASoC: SOF: intel: fix wrong poll bits in dsp power down +- ASoC: SOF: Intel: unregister DMIC device on probe error +- ASoC: Intel: bytcr_rt5640: Fix HP Pavilion x2 10-p0XX OVCD current threshold +- ASoC: fsl_ssi: Fix TDM slot setup for I2S mode +- drm/amd/display: Correct algorithm for reversed gamma +- vhost-vdpa: set v->config_ctx to NULL if eventfd_ctx_fdget() fails +- vhost-vdpa: fix use-after-free of v->config_ctx +- btrfs: fix slab cache flags for free space tree bitmap +- btrfs: fix race when cloning extent buffer during rewind of an old root +- zonefs: fix to update .i_wr_refcnt correctly in zonefs_open_zone() +- zonefs: prevent use of seq files as swap file +- zonefs: Fix O_APPEND async write handling +- s390/pci: fix leak of PCI device structure +- s390/pci: remove superfluous zdev->zbus check +- s390/pci: refactor zpci_create_device() +- s390/vtime: fix increased steal time accounting +- Revert "PM: runtime: Update device status before letting suppliers suspend" +- ALSA: hda/realtek: fix mute/micmute LEDs for HP 850 G8 +- ALSA: hda/realtek: fix mute/micmute LEDs for HP 440 G8 +- ALSA: hda/realtek: fix mute/micmute LEDs for HP 840 G8 +- ALSA: hda/realtek: Apply headset-mic quirks for Xiaomi Redmibook Air +- ALSA: hda: generic: Fix the micmute led init state +- ALSA: hda/realtek: apply pin quirk for XiaomiNotebook Pro +- ALSA: dice: fix null pointer dereference when node is disconnected +- spi: cadence: set cqspi to the driver_data field of struct device +- ASoC: ak5558: Add MODULE_DEVICE_TABLE +- ASoC: ak4458: Add MODULE_DEVICE_TABLE +- sdei_watchdog: Fix compile error when PPC_WATCHDOG is disable on PowerPC +- net: dsa: b53: Support setting learning on port +- ALSA: usb-audio: Don't avoid stopping the stream at disconnection +- Revert "nfsd4: a client's own opens needn't prevent delegations" +- Revert "nfsd4: remove check_conflicting_opens warning" +- fuse: fix live lock in fuse_iget() +- RDMA/srp: Fix support for unpopulated and unbalanced NUMA nodes +- bpf, selftests: Fix up some test_verifier cases for unprivileged +- bpf: Add sanity check for upper ptr_limit +- bpf: Simplify alu_limit masking for pointer arithmetic +- bpf: Fix off-by-one for area size in creating mask to left +- bpf: Prohibit alu ops for pointer types not defining ptr_limit +- crypto: x86/aes-ni-xts - use direct calls to and 4-way stride +- crypto: aesni - Use TEST %reg,%reg instead of CMP $0,%reg +- arm32: kaslr: Fix clock_gettime and gettimeofday performance degradation when configure CONFIG_RANDOMIZE_BASE +- arm32: kaslr: Print the real kaslr offset when kernel panic +- arm32: kaslr: Fix the bug of symbols relocation +- arm32: kaslr: Adapt dts files of multiple memory nodes +- arm32: kaslr: Fix the bug of hidden symbols when decompressing code is compiled +- arm32: kaslr: Fix the bug of module install failure +- arm32: kaslr: Add missing sections about relocatable +- arm64: Enable passing IMA log to next kernel on kexec +- powerpc: Delete unused function delete_fdt_mem_rsv() +- kexec: Use fdt_appendprop_addrrange() to add ima buffer to FDT +- powerpc: Move arch independent ima kexec functions to drivers/of/kexec.c +- powerpc: Enable passing IMA log to next kernel on kexec +- powerpc: Move ima buffer fields to struct kimage +- powerpc: Use common of_kexec_alloc_and_setup_fdt() +- arm64: Use common of_kexec_alloc_and_setup_fdt() +- of: Add a common kexec FDT setup function +- x86: Use ELF fields defined in 'struct kimage' +- powerpc: Use ELF fields defined in 'struct kimage' +- arm64: Use ELF fields defined in 'struct kimage' +- kexec: Move ELF fields to struct kimage +- ext4: fix timer use-after-free on failed mount +- ext4: drop ext4_handle_dirty_super() +- ext4: use sbi instead of EXT4_SB(sb) in ext4_update_super() +- ext4: save error info to sb through journal if available +- ext4: protect superblock modifications with a buffer lock +- ext4: drop sync argument of ext4_commit_super() +- ext4: combine ext4_handle_error() and save_error_info() +- ext4: defer saving error info from atomic context +- ext4: simplify ext4 error translation +- ext4: move functions in super.c +- ext4: make ext4_abort() use __ext4_error() +- ext4: standardize error message in ext4_protect_reserved_inode() +- ext4: remove redundant sb checksum recomputation +- RDMA/umem: Use ib_dma_max_seg_size instead of dma_get_max_seg_size +- KVM: arm64: Fix nVHE hyp panic host context restore +- xen/events: avoid handling the same event on two cpus at the same time +- xen/events: don't unmask an event channel when an eoi is pending +- mm/page_alloc.c: refactor initialization of struct page for holes in memory layout +- KVM: arm64: Ensure I-cache isolation between vcpus of a same VM +- mm/madvise: replace ptrace attach requirement for process_madvise +- mm/userfaultfd: fix memory corruption due to writeprotect +- KVM: arm64: Fix exclusive limit for IPA size +- KVM: arm64: Reject VM creation when the default IPA size is unsupported +- KVM: arm64: nvhe: Save the SPE context early +- KVM: arm64: Avoid corrupting vCPU context register in guest exit +- KVM: arm64: Fix range alignment when walking page tables +- KVM: kvmclock: Fix vCPUs > 64 can't be online/hotpluged +- KVM: x86: Ensure deadline timer has truly expired before posting its IRQ +- x86/entry: Fix entry/exit mismatch on failed fast 32-bit syscalls +- x86/sev-es: Use __copy_from_user_inatomic() +- x86/sev-es: Correctly track IRQ states in runtime #VC handler +- x86/entry: Move nmi entry/exit into common code +- x86/sev-es: Check regs->sp is trusted before adjusting #VC IST stack +- x86/sev-es: Introduce ip_within_syscall_gap() helper +- x86/unwind/orc: Disable KASAN checking in the ORC unwinder, part 2 +- binfmt_misc: fix possible deadlock in bm_register_write +- powerpc: Fix missing declaration of [en/dis]able_kernel_vsx() +- powerpc: Fix inverted SET_FULL_REGS bitop +- powerpc/64s: Fix instruction encoding for lis in ppc_function_entry() +- efi: stub: omit SetVirtualAddressMap() if marked unsupported in RT_PROP table +- sched/membarrier: fix missing local execution of ipi_sync_rq_state() +- linux/compiler-clang.h: define HAVE_BUILTIN_BSWAP* +- zram: fix return value on writeback_store +- include/linux/sched/mm.h: use rcu_dereference in in_vfork() +- stop_machine: mark helpers __always_inline +- seqlock,lockdep: Fix seqcount_latch_init() +- powerpc/64s/exception: Clean up a missed SRR specifier +- hrtimer: Update softirq_expires_next correctly after __hrtimer_get_next_event() +- perf/x86/intel: Set PERF_ATTACH_SCHED_CB for large PEBS and LBR +- perf/core: Flush PMU internal buffers for per-CPU events +- arm64: mm: use a 48-bit ID map when possible on 52-bit VA builds +- configfs: fix a use-after-free in __configfs_open_file +- nvme-fc: fix racing controller reset and create association +- block: rsxx: fix error return code of rsxx_pci_probe() +- NFSv4.2: fix return value of _nfs4_get_security_label() +- NFS: Don't gratuitously clear the inode cache when lookup failed +- NFS: Don't revalidate the directory permissions on a lookup failure +- SUNRPC: Set memalloc_nofs_save() for sync tasks +- arm64/mm: Fix pfn_valid() for ZONE_DEVICE based memory +- cpufreq: qcom-hw: Fix return value check in qcom_cpufreq_hw_cpu_init() +- cpufreq: qcom-hw: fix dereferencing freed memory 'data' +- sh_eth: fix TRSCER mask for R7S72100 +- staging: comedi: pcl818: Fix endian problem for AI command data +- staging: comedi: pcl711: Fix endian problem for AI command data +- staging: comedi: me4000: Fix endian problem for AI command data +- staging: comedi: dmm32at: Fix endian problem for AI command data +- staging: comedi: das800: Fix endian problem for AI command data +- staging: comedi: das6402: Fix endian problem for AI command data +- staging: comedi: adv_pci1710: Fix endian problem for AI command data +- staging: comedi: addi_apci_1500: Fix endian problem for command sample +- staging: comedi: addi_apci_1032: Fix endian problem for COS sample +- staging: rtl8192e: Fix possible buffer overflow in _rtl92e_wx_set_scan +- staging: rtl8712: Fix possible buffer overflow in r8712_sitesurvey_cmd +- staging: ks7010: prevent buffer overflow in ks_wlan_set_scan() +- staging: rtl8188eu: fix potential memory corruption in rtw_check_beacon_data() +- staging: rtl8712: unterminated string leads to read overflow +- staging: rtl8188eu: prevent ->ssid overflow in rtw_wx_set_scan() +- staging: rtl8192u: fix ->ssid overflow in r8192_wx_set_scan() +- misc: fastrpc: restrict user apps from sending kernel RPC messages +- misc/pvpanic: Export module FDT device table +- Revert "serial: max310x: rework RX interrupt handling" +- usbip: fix vudc usbip_sockfd_store races leading to gpf +- usbip: fix vhci_hcd attach_store() races leading to gpf +- usbip: fix stub_dev usbip_sockfd_store() races leading to gpf +- usbip: fix vudc to check for stream socket +- usbip: fix vhci_hcd to check for stream socket +- usbip: fix stub_dev to check for stream socket +- USB: serial: cp210x: add some more GE USB IDs +- USB: serial: cp210x: add ID for Acuity Brands nLight Air Adapter +- USB: serial: ch341: add new Product ID +- USB: serial: io_edgeport: fix memory leak in edge_startup +- xhci: Fix repeated xhci wake after suspend due to uncleared internal wake state +- usb: xhci: Fix ASMedia ASM1042A and ASM3242 DMA addressing +- xhci: Improve detection of device initiated wake signal. +- usb: xhci: do not perform Soft Retry for some xHCI hosts +- usb: renesas_usbhs: Clear PIPECFG for re-enabling pipe with other EPNUM +- USB: usblp: fix a hang in poll() if disconnected +- usb: dwc3: qcom: Honor wakeup enabled/disabled state +- usb: dwc3: qcom: add ACPI device id for sc8180x +- usb: dwc3: qcom: add URS Host support for sdm845 ACPI boot +- usb: dwc3: qcom: Add missing DWC3 OF node refcount decrement +- usb: gadget: f_uac1: stop playback on function disable +- usb: gadget: f_uac2: always increase endpoint max_packet_size by one audio slot +- USB: gadget: u_ether: Fix a configfs return code +- USB: gadget: udc: s3c2410_udc: fix return value check in s3c2410_udc_probe() +- Goodix Fingerprint device is not a modem +- cifs: do not send close in compound create+close requests +- mmc: cqhci: Fix random crash when remove mmc module/card +- mmc: core: Fix partition switch time for eMMC +- mmc: mmci: Add MMC_CAP_NEED_RSP_BUSY for the stm32 variants +- xen/events: reset affinity of 2-level event when tearing it down +- software node: Fix node registration +- s390/dasd: fix hanging IO request during DASD driver unbind +- s390/dasd: fix hanging DASD driver unbind +- arm64: perf: Fix 64-bit event counter read truncation +- arm64: mte: Map hotplugged memory as Normal Tagged +- arm64: kasan: fix page_alloc tagging with DEBUG_VIRTUAL +- block: Try to handle busy underlying device on discard +- block: Discard page cache of zone reset target range +- Revert 95ebabde382c ("capabilities: Don't allow writing ambiguous v3 file capabilities") +- ALSA: usb-audio: fix use after free in usb_audio_disconnect +- ALSA: usb-audio: fix NULL ptr dereference in usb_audio_probe +- ALSA: usb-audio: Disable USB autosuspend properly in setup_disable_autosuspend() +- ALSA: usb-audio: Apply the control quirk to Plantronics headsets +- ALSA: usb-audio: Fix "cannot get freq eq" errors on Dell AE515 sound bar +- ALSA: hda: Avoid spurious unsol event handling during S3/S4 +- ALSA: hda: Flush pending unsolicited events before suspend +- ALSA: hda: Drop the BATCH workaround for AMD controllers +- ALSA: hda/ca0132: Add Sound BlasterX AE-5 Plus support +- ALSA: hda/conexant: Add quirk for mute LED control on HP ZBook G5 +- ALSA: hda/hdmi: Cancel pending works before suspend +- ALSA: usb: Add Plantronics C320-M USB ctrl msg delay quirk +- ARM: 9029/1: Make iwmmxt.S support Clang's integrated assembler +- mmc: sdhci: Update firmware interface API +- clk: qcom: gpucc-msm8998: Add resets, cxc, fix flags on gpu_gx_gdsc +- scsi: target: core: Prevent underflow for service actions +- scsi: target: core: Add cmd length set before cmd complete +- scsi: libiscsi: Fix iscsi_prep_scsi_cmd_pdu() error handling +- sysctl.c: fix underflow value setting risk in vm_table +- drivers/base/memory: don't store phys_device in memory blocks +- s390/smp: __smp_rescan_cpus() - move cpumask away from stack +- kasan: fix memory corruption in kasan_bitops_tags test +- i40e: Fix memory leak in i40e_probe +- PCI: Fix pci_register_io_range() memory leak +- kbuild: clamp SUBLEVEL to 255 +- ext4: don't try to processed freed blocks until mballoc is initialized +- PCI/LINK: Remove bandwidth notification +- drivers/base: build kunit tests without structleak plugin +- PCI: mediatek: Add missing of_node_put() to fix reference leak +- PCI: xgene-msi: Fix race in installing chained irq handler +- Input: applespi - don't wait for responses to commands indefinitely. +- sparc64: Use arch_validate_flags() to validate ADI flag +- sparc32: Limit memblock allocation to low memory +- clk: qcom: gdsc: Implement NO_RET_PERIPH flag +- iommu/amd: Fix performance counter initialization +- powerpc/64: Fix stack trace not displaying final frame +- HID: logitech-dj: add support for the new lightspeed connection iteration +- powerpc/perf: Record counter overflow always if SAMPLE_IP is unset +- powerpc: improve handling of unrecoverable system reset +- spi: stm32: make spurious and overrun interrupts visible +- powerpc/pci: Add ppc_md.discover_phbs() +- Platform: OLPC: Fix probe error handling +- mmc: sdhci-iproc: Add ACPI bindings for the RPi +- mmc: mediatek: fix race condition between msdc_request_timeout and irq +- mmc: mxs-mmc: Fix a resource leak in an error handling path in 'mxs_mmc_probe()' +- iommu/vt-d: Clear PRQ overflow only when PRQ is empty +- udf: fix silent AED tagLocation corruption +- scsi: ufs: WB is only available on LUN #0 to #7 +- i2c: rcar: optimize cacheline to minimize HW race condition +- i2c: rcar: faster irq code to minimize HW race condition +- ath11k: fix AP mode for QCA6390 +- ath11k: start vdev if a bss peer is already created +- ath11k: peer delete synchronization with firmware +- net: enetc: initialize RFS/RSS memories for unused ports too +- enetc: Fix unused var build warning for CONFIG_OF +- net: dsa: tag_mtk: fix 802.1ad VLAN egress +- net: dsa: tag_ar9331: let DSA core deal with TX reallocation +- net: dsa: tag_gswip: let DSA core deal with TX reallocation +- net: dsa: tag_dsa: let DSA core deal with TX reallocation +- net: dsa: tag_brcm: let DSA core deal with TX reallocation +- net: dsa: tag_edsa: let DSA core deal with TX reallocation +- net: dsa: tag_lan9303: let DSA core deal with TX reallocation +- net: dsa: tag_mtk: let DSA core deal with TX reallocation +- net: dsa: tag_ocelot: let DSA core deal with TX reallocation +- net: dsa: tag_qca: let DSA core deal with TX reallocation +- net: dsa: trailer: don't allocate additional memory for padding/tagging +- net: dsa: tag_ksz: don't allocate additional memory for padding/tagging +- net: dsa: implement a central TX reallocation procedure +- s390/qeth: fix notification for pending buffers during teardown +- s390/qeth: improve completion of pending TX buffers +- s390/qeth: remove QETH_QDIO_BUF_HANDLED_DELAYED state +- s390/qeth: don't replace a fully completed async TX buffer +- net: hns3: fix error mask definition of flow director +- cifs: fix credit accounting for extra channel +- media: rc: compile rc-cec.c into rc-core +- media: v4l: vsp1: Fix bru null pointer access +- media: v4l: vsp1: Fix uif null pointer access +- media: rkisp1: params: fix wrong bits settings +- media: usbtv: Fix deadlock on suspend +- sh_eth: fix TRSCER mask for R7S9210 +- qxl: Fix uninitialised struct field head.surface_id +- s390/crypto: return -EFAULT if copy_to_user() fails +- s390/cio: return -EFAULT if copy_to_user() fails +- drm/i915: Wedge the GPU if command parser setup fails +- drm/shmem-helpers: vunmap: Don't put pages for dma-buf +- drm: meson_drv add shutdown function +- drm: Use USB controller's DMA mask when importing dmabufs +- drm/shmem-helper: Don't remove the offset in vm_area_struct pgoff +- drm/shmem-helper: Check for purged buffers in fault handler +- drm/amdgpu/display: handle aux backlight in backlight_get_brightness +- drm/amdgpu/display: don't assert in set backlight function +- drm/amdgpu/display: simplify backlight setting +- drm/amd/pm: bug fix for pcie dpm +- drm/amd/display: Fix nested FPU context in dcn21_validate_bandwidth() +- drm/amdgpu/display: use GFP_ATOMIC in dcn21_validate_bandwidth_fp() +- drm/amd/display: Add a backlight module option +- drm/compat: Clear bounce structures +- gpio: fix gpio-device list corruption +- gpio: pca953x: Set IRQ type when handle Intel Galileo Gen 2 +- gpiolib: acpi: Allow to find GpioInt() resource by name and index +- gpiolib: acpi: Add ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER quirk +- bnxt_en: reliably allocate IRQ table on reset to avoid crash +- s390/cio: return -EFAULT if copy_to_user() fails again +- net: hns3: fix bug when calculating the TCAM table info +- net: hns3: fix query vlan mask value error for flow director +- perf report: Fix -F for branch & mem modes +- perf traceevent: Ensure read cmdlines are null terminated. +- mlxsw: spectrum_ethtool: Add an external speed to PTYS register +- selftests: forwarding: Fix race condition in mirror installation +- net: phy: make mdio_bus_phy_suspend/resume as __maybe_unused +- ethtool: fix the check logic of at least one channel for RX/TX +- net: stmmac: fix wrongly set buffer2 valid when sph unsupport +- net: stmmac: fix watchdog timeout during suspend/resume stress test +- net: stmmac: stop each tx channel independently +- perf build: Fix ccache usage in $(CC) when generating arch errno table +- tools/resolve_btfids: Fix build error with older host toolchains +- ixgbe: fail to create xfrm offload of IPsec tunnel mode SA +- r8169: fix r8168fp_adjust_ocp_cmd function +- s390/qeth: fix memory leak after failed TX Buffer allocation +- net: qrtr: fix error return code of qrtr_sendmsg() +- net: enetc: allow hardware timestamping on TX queues with tc-etf enabled +- net: davicom: Fix regulator not turned off on driver removal +- net: davicom: Fix regulator not turned off on failed probe +- net: lapbether: Remove netif_start_queue / netif_stop_queue +- stmmac: intel: Fixes clock registration error seen for multiple interfaces +- net: stmmac: Fix VLAN filter delete timeout issue in Intel mGBE SGMII +- cipso,calipso: resolve a number of problems with the DOI refcounts +- netdevsim: init u64 stats for 32bit hardware +- net: usb: qmi_wwan: allow qmimux add/del with master up +- net: dsa: sja1105: fix SGMII PCS being forced to SPEED_UNKNOWN instead of SPEED_10 +- net: mscc: ocelot: properly reject destination IP keys in VCAP IS1 +- net: sched: avoid duplicates in classes dump +- nexthop: Do not flush blackhole nexthops when loopback goes down +- net: stmmac: fix incorrect DMA channel intr enable setting of EQoS v4.10 +- net/mlx4_en: update moderation when config reset +- net: ethernet: mtk-star-emac: fix wrong unmap in RX handling +- net: enetc: keep RX ring consumer index in sync with hardware +- net: enetc: remove bogus write to SIRXIDR from enetc_setup_rxbdr +- net: enetc: force the RGMII speed and duplex instead of operating in inband mode +- net: enetc: don't disable VLAN filtering in IFF_PROMISC mode +- net: enetc: fix incorrect TPID when receiving 802.1ad tagged packets +- net: enetc: take the MDIO lock only once per NAPI poll cycle +- net: enetc: don't overwrite the RSS indirection table when initializing +- sh_eth: fix TRSCER mask for SH771x +- net: dsa: tag_rtl4_a: fix egress tags +- docs: networking: drop special stable handling +- Revert "mm, slub: consider rest of partial list if acquire_slab() fails" +- cifs: return proper error code in statfs(2) +- mount: fix mounting of detached mounts onto targets that reside on shared mounts +- powerpc/603: Fix protection of user pages mapped with PROT_NONE +- mt76: dma: do not report truncated frames to mac80211 +- ibmvnic: always store valid MAC address +- ibmvnic: Fix possibly uninitialized old_num_tx_queues variable warning. +- libbpf: Clear map_info before each bpf_obj_get_info_by_fd +- samples, bpf: Add missing munmap in xdpsock +- selftests/bpf: Mask bpf_csum_diff() return value to 16 bits in test_verifier +- selftests/bpf: No need to drop the packet when there is no geneve opt +- selftests/bpf: Use the last page in test_snprintf_btf on s390 +- net: phy: fix save wrong speed and duplex problem if autoneg is on +- net: always use icmp{,v6}_ndo_send from ndo_start_xmit +- netfilter: x_tables: gpf inside xt_find_revision() +- netfilter: nf_nat: undo erroneous tcp edemux lookup +- tcp: add sanity tests to TCP_QUEUE_SEQ +- tcp: Fix sign comparison bug in getsockopt(TCP_ZEROCOPY_RECEIVE) +- can: tcan4x5x: tcan4x5x_init(): fix initialization - clear MRAM before entering Normal Mode +- can: flexcan: invoke flexcan_chip_freeze() to enter freeze mode +- can: flexcan: enable RX FIFO after FRZ/HALT valid +- can: flexcan: assert FRZ bit in flexcan_chip_freeze() +- can: skb: can_skb_set_owner(): fix ref counting if socket was closed before setting skb ownership +- net: l2tp: reduce log level of messages in receive path, add counter instead +- net: avoid infinite loop in mpls_gso_segment when mpls_hlen == 0 +- net: check if protocol extracted by virtio_net_hdr_set_proto is correct +- net: Fix gro aggregation for udp encaps with zero csum +- ath9k: fix transmitting to stations in dynamic SMPS mode +- crypto: mips/poly1305 - enable for all MIPS processors +- ethernet: alx: fix order of calls on resume +- powerpc/pseries: Don't enforce MSI affinity with kdump +- powerpc/perf: Fix handling of privilege level checks in perf interrupt context +- uapi: nfnetlink_cthelper.h: fix userspace compilation error +- arm64/mpam: fix a memleak in add_schema +- cacheinfo: workaround cacheinfo's info_list uninitialized error +- openeuler_defconfig: Enable MPAM by default +- arm64/mpam: Sort domains when cpu online +- arm64/mpam: resctrl: Refresh cpu mask for handling cpuhp +- arm64/mpam: resctrl: Allow setting register MPAMCFG_MBW_MIN to 0 +- arm64/mpam: resctrl: Use resctrl_group_init_alloc() for default group +- arm64/mpam: resctrl: Add proper error handling to resctrl_mount() +- arm64/mpam: Use fs_context to parse mount options +- arm64/mpam: Supplement additional useful ctrl features for mount options +- arm64/mpam: Set per-cpu's closid to none zero for cdp +- arm64/mpam: Simplify mpamid cdp mapping process +- arm64/mpam: Filter schema control type with ctrl features +- arm64/mpam: resctrl: Add rmid file in resctrl sysfs +- arm64/mpam: Split header files into suitable location +- arm64/mpam: resctrl: Export resource's properties to info directory +- arm64/mpam: Add resctrl_ctrl_feature structure to manage ctrl features +- arm64/mpam: Add wait queue for monitor alloc and free +- arm64/mpam: Remap reqpartid,pmg to rmid and intpartid to closid +- arm64/mpam: Separate internal and downstream priority event +- arm64/mpam: Enabling registering and logging error interrupts +- arm64/mpam: Fix MPAM_ESR intPARTID_range error +- arm64/mpam: Integrate monitor data for Memory Bandwidth if cdp enabled +- arm64/mpam: Add hook-events id for ctrl features +- arm64/mpam: Re-plan intpartid narrowing process +- arm64/mpam: Restore extend ctrls' max width for checking schemata input +- arm64/mpam: Squash default priority from mpam device to class +- arm64/mpam: Store intpri and dspri for mpam device reset +- arm64/mpam: resctrl: Support priority and hardlimit(Memory bandwidth) configuration +- arm64/mpam: resctrl: Support cpus' monitoring for mon group +- arm64/mpam: resctrl: collect child mon group's monitor data +- arm64/mpam: Using software-defined id for rdtgroup instead of 32-bit integer +- arm64/mpam: Implement intpartid narrowing process +- arm64/mpam: resctrl: Remove unnecessary CONFIG_ARM64 +- arm64/mpam: resctrl: Remove ctrlmon sysfile +- arm64/mpam: Clean up header files and rearrange declarations +- arm64/mpam: resctrl: Support cdp on monitoring data +- arm64/mpam: Support cdp on allocating monitors +- arm64/mpam: resctrl: Move ctrlmon sysfile write/read function to mpam_ctrlmon.c +- arm64/mpam: resctrl: Update closid alloc and free process with bitmap +- arm64/mpam: resctrl: Update resources reset process +- arm64/mpam: Support cdp in mpam_sched_in() +- arm64/mpam: resctrl: Write and read schemata by schema_list +- arm64/mpam: resctrl: Use resctrl_group_init_alloc() to init schema list +- arm64/mpam: resctrl: Add helpers for init and destroy schemata list +- arm64/mpam: resctrl: Supplement cdpl2,cdpl3 for mount options +- arm64/mpam: resctrl: Append schemata CDP definitions +- arm64/mpam: resctrl: Rebuild configuration and monitoring pipeline +- arm64/mpam: Probe partid,pmg and feature capabilities' ranges from classes +- arm64/mpam: Add helper for getting MSCs' configuration +- arm64/mpam: Migrate old MSCs' discovery process to new branch +- drivers: base: cacheinfo: Add helper to search cacheinfo by of_node +- arm64/mpam: Implement helpers for handling configuration and monitoring +- arm64/mpam: resctrl: Handle cpuhp and resctrl_dom allocation +- arm64/mpam: resctrl: Re-synchronise resctrl's view of online CPUs +- arm64/mpam: Init resctrl resources' info from resctrl_res selected +- arm64/mpam: Pick MPAM resources and events for resctrl_res exported +- arm64/mpam: Allocate mpam component configuration arrays +- arm64/mpam: Summarize feature support during mpam_enable() +- arm64/mpam: Reset controls when CPUs come online +- arm64/mpam: Add helper for getting mpam sysprops +- arm64/mpam: Probe the features resctrl supports +- arm64/mpam: Supplement MPAM MSC register layout definitions +- arm64/mpam: Probe supported partid/pmg ranges from devices +- arm64/mpam: Add mpam driver discovery phase and kbuild boiler plate +- arm64/mpam: Preparing for MPAM refactoring +- arm64/mpam: Supplement err tips in info/last_cmd_status +- arm64/mpam: Fix unreset resources when mkdir ctrl group or umount resctrl +- MPAM / ACPI: Refactoring MPAM init process and set MPAM ACPI as entrance +- ACPI 6.x: Add definitions for MPAM table +- ACPI / PPTT: cacheinfo: Label caches based on fw_token +- ACPI / PPTT: Filthy hack to find _a_ backwards reference in the PPTT [ROTTEN] +- ACPI / PPTT: Add helper to validate cache nodes from an offset [dead] +- ACPI / processor: Add helper to convert acpi_id to a phys_cpuid +- arm64/mpam: cleanup the source file's licence +- mpam : fix monitor's disorder from +- mpam : fix missing fill MSMON_CFG_MON_SEL register +- arm64/mpam: use snprintf instead of sprintf +- arm64/mpam: cleanup debuging code +- arm64/mpam: fix a missing unlock in error branch +- arm64/mpam: remove unnecessary debug message and dead code +- arm64/mpam: correct num of partid/pmg +- arm64/mpam: get num_partids from system regs instead of hard code +- arm64/mpam: update group flags only when enable sucsses +- arm64/mpam: remove unsupported resource +- arm64/mpam: only add new domain node to domain list +- arm64/mpam: unmap all previous address when failed +- arm64/mpam: destroy domain list when failed to init +- arm64/mpam: fix hard code address map for 1620 2P +- mpam: fix potential resource leak in mpam_domains_init +- mpam: Code security rectification +- cmetrics: remove dead code in mpam_ctrlmon.c and resctrlfs.c +- arm64/mpam: fix compile warning +- arm64/mpam: add cmdline option: mpam +- resctrlfs: fix up RESCTRL dependency +- arm64/mpam: hard code mpam resource for Hi1620 2P +- arm64/mpam: support L3TALL, HHALL +- arm64/mpam: debug: remove debug pr_info at schemata +- arm64/mpam: use 5% as min memory bandwidth +- arm64/mpam: don't allowd create mon_groups when out of mon/pmg +- arm64/mpam: fix HHA MAX SET/GET operation +- arm64/mpam: monitor pmg as a property of partid +- arm64/mpam: enable alloc/mon capable when MPAM enabled +- arm64/mpam: add L3TALL & HHALL +- arm64/mpam: alloc/mon capable/enabled debug +- arm64/mpam: get alloc/mon capable/enabled from h/w +- arm64/mpam: don't reserve mon 0, we can use it as nomarl +- arm64/mpam: get num_mon & num_pmg from hardware +- arm64/mpam: add num_monitors in info dir +- arm64/mpam: mon: add WARN_ON for debug free_pmg +- arm64/mpam: free mon when remove momgroups +- arm64/mpam: operation not permitted when remove a ctrl group with a mondata +- arm64/mpam: support monitor +- arm64/mpam: disable MPAM_SYS_REG_DEBUG +- arm64/mpam: print mpam caps info when booting +- arm64/mpam: add mpam extension runtime detection +- arm64/mpam: support num_partids/num_pmgs +- arm64/mpam: support monitor +- arm64/mpam: support monitor read +- arm64/mpam: pass rdtgroup when create mon_data dir +- arm64/mpam: add group partid/pmg to tasks show +- arm64/mpam: debug: print debug info when create mon_data +- arm64/mpam: debug: print more useful info for mon_data +- resctrlfs: mpam: Build basic framework for mpam +- resctrlfs: init support resctrlfs +- nvme-pci: add quirks for Lexar 256GB SSD +- nvme-pci: mark Seagate Nytro XM1440 as QUIRK_NO_NS_DESC_LIST. +- KVM: SVM: Clear the CR4 register on reset +- scsi: ufs: Fix a duplicate dev quirk number +- ASoC: Intel: sof_sdw: add quirk for HP Spectre x360 convertible +- ASoC: Intel: sof_sdw: reorganize quirks by generation +- PCI: cadence: Retrain Link to work around Gen2 training defect +- ALSA: usb-audio: add mixer quirks for Pioneer DJM-900NXS2 +- ALSA: usb-audio: Add DJM750 to Pioneer mixer quirk +- HID: i2c-hid: Add I2C_HID_QUIRK_NO_IRQ_AFTER_RESET for ITE8568 EC on Voyo Winpad A15 +- mmc: sdhci-of-dwcmshc: set SDHCI_QUIRK2_PRESET_VALUE_BROKEN +- drm/msm/a5xx: Remove overwriting A5XX_PC_DBG_ECO_CNTL register +- scsi: ufs: ufs-exynos: Use UFSHCD_QUIRK_ALIGN_SG_WITH_PAGE_SIZE +- scsi: ufs: ufs-exynos: Apply vendor-specific values for three timeouts +- scsi: ufs: Introduce a quirk to allow only page-aligned sg entries +- misc: eeprom_93xx46: Add quirk to support Microchip 93LC46B eeprom +- scsi: ufs: Add a quirk to permit overriding UniPro defaults +- scsi: ufs-mediatek: Enable UFSHCI_QUIRK_SKIP_MANUAL_WB_FLUSH_CTRL +- ASoC: Intel: sof_sdw: add missing TGL_HDMI quirk for Dell SKU 0A32 +- KVM: x86: Supplement __cr4_reserved_bits() with X86_FEATURE_PCID check +- PCI: Add function 1 DMA alias quirk for Marvell 9215 SATA controller +- usb: cdns3: fix NULL pointer dereference on no platform data +- usb: cdns3: add quirk for enable runtime pm by default +- usb: cdns3: host: add xhci_plat_priv quirk XHCI_SKIP_PHY_INIT +- usb: cdns3: host: add .suspend_quirk for xhci-plat.c +- ASoC: Intel: bytcr_rt5640: Add quirk for ARCHOS Cesium 140 +- ACPI: video: Add DMI quirk for GIGABYTE GB-BXBT-2807 +- media: cx23885: add more quirks for reset DMA on some AMD IOMMU +- HID: mf: add support for 0079:1846 Mayflash/Dragonrise USB Gamecube Adapter +- platform/x86: acer-wmi: Add ACER_CAP_KBD_DOCK quirk for the Aspire Switch 10E SW3-016 +- platform/x86: acer-wmi: Add support for SW_TABLET_MODE on Switch devices +- platform/x86: acer-wmi: Add ACER_CAP_SET_FUNCTION_MODE capability flag +- platform/x86: acer-wmi: Add new force_caps module parameter +- platform/x86: acer-wmi: Cleanup accelerometer device handling +- platform/x86: acer-wmi: Cleanup ACER_CAP_FOO defines +- bus: ti-sysc: Implement GPMC debug quirk to drop platform data +- ASoC: Intel: sof_sdw: add quirk for new TigerLake-SDCA device +- mwifiex: pcie: skip cancel_work_sync() on reset failure path +- Bluetooth: btqca: Add valid le states quirk +- iommu/amd: Fix sleeping in atomic in increase_address_space() +- btrfs: don't flush from btrfs_delayed_inode_reserve_metadata +- btrfs: export and rename qgroup_reserve_meta +- arm64: Make CPU_BIG_ENDIAN depend on ld.bfd or ld.lld 13.0.0+ +- parisc: Enable -mlong-calls gcc option with CONFIG_COMPILE_TEST +- nvme-pci: mark Kingston SKC2000 as not supporting the deepest power state +- ASoC: SOF: Intel: broadwell: fix mutual exclusion with catpt driver +- ACPICA: Fix race in generic_serial_bus (I2C) and GPIO op_region parameter handling +- r8169: fix resuming from suspend on RTL8105e if machine runs on battery +- tomoyo: recognize kernel threads correctly +- Revert "arm64: dts: amlogic: add missing ethernet reset ID" +- iommu/vt-d: Fix status code for Allocate/Free PASID command +- rsxx: Return -EFAULT if copy_to_user() fails +- ftrace: Have recordmcount use w8 to read relp->r_info in arm64_is_fake_mcount +- ALSA: hda: intel-nhlt: verify config type +- IB/mlx5: Add missing error code +- RDMA/rxe: Fix missing kconfig dependency on CRYPTO +- RDMA/cm: Fix IRQ restore in ib_send_cm_sidr_rep +- ALSA: ctxfi: cthw20k2: fix mask on conf to allow 4 bits +- drm/amdgpu: fix parameter error of RREG32_PCIE() in amdgpu_regs_pcie +- drm/amdgpu:disable VCN for Navi12 SKU +- dm verity: fix FEC for RS roots unaligned to block size +- dm bufio: subtract the number of initial sectors in dm_bufio_get_device_size +- io_uring: ignore double poll add on the same waitqueue head +- ring-buffer: Force before_stamp and write_stamp to be different on discard +- PM: runtime: Update device status before letting suppliers suspend +- btrfs: fix warning when creating a directory with smack enabled +- btrfs: unlock extents in btrfs_zero_range in case of quota reservation errors +- btrfs: free correct amount of space in btrfs_delayed_inode_reserve_metadata +- btrfs: validate qgroup inherit for SNAP_CREATE_V2 ioctl +- btrfs: fix race between extent freeing/allocation when using bitmaps +- btrfs: fix stale data exposure after cloning a hole with NO_HOLES enabled +- btrfs: fix race between swap file activation and snapshot creation +- btrfs: fix race between writes to swap files and scrub +- btrfs: fix raid6 qstripe kmap +- btrfs: avoid double put of block group when emptying cluster +- tpm, tpm_tis: Decorate tpm_get_timeouts() with request_locality() +- tpm, tpm_tis: Decorate tpm_tis_gen_interrupt() with request_locality() +- ALSA: usb-audio: Drop bogus dB range in too low level +- ALSA: usb-audio: use Corsair Virtuoso mapping for Corsair Virtuoso SE +- ALSA: hda/realtek: Enable headset mic of Acer SWIFT with ALC256 +- powerpc: Do not compile any dts if CONFIG_OF_ALL_DTBS=y +- ext4: find old entry again if failed to rename whiteout +- net: sfp: add workaround for Realtek RTL8672 and RTL9601C chips +- net: sfp: VSOL V2801F / CarlitoxxPro CPGOS03-0490 v2.0 workaround +- ALSA: hda/realtek: Apply dual codec quirks for MSI Godlike X570 board +- ALSA: hda/realtek: Add quirk for Intel NUC 10 +- ALSA: hda/realtek: Add quirk for Clevo NH55RZQ +- media: v4l: ioctl: Fix memory leak in video_usercopy +- tty: teach the n_tty ICANON case about the new "cookie continuations" too +- tty: teach n_tty line discipline about the new "cookie continuations" +- tty: clean up legacy leftovers from n_tty line discipline +- tty: fix up hung_up_tty_read() conversion +- tty: fix up iterate_tty_read() EOVERFLOW handling +- powerpc/sstep: Fix incorrect return from analyze_instr() +- powerpc/sstep: Check instruction validity against ISA version before emulation +- swap: fix swapfile read/write offset +- remoteproc/mediatek: Fix kernel test robot warning +- zsmalloc: account the number of compacted pages correctly +- xen: fix p2m size in dom0 for disabled memory hotplug case +- xen-netback: respect gnttab_map_refs()'s return value +- Xen/gnttab: handle p2m update errors on a per-slot basis +- scsi: iscsi: Verify lengths on passthrough PDUs +- scsi: iscsi: Ensure sysfs attributes are limited to PAGE_SIZE +- scsi: iscsi: Restrict sessions and handles to admin capabilities +- ASoC: Intel: bytcr_rt5640: Add quirk for the Acer One S1002 tablet +- ASoC: Intel: bytcr_rt5651: Add quirk for the Jumper EZpad 7 tablet +- ASoC: Intel: bytcr_rt5640: Add quirk for the Voyo Winpad A15 tablet +- ASoC: Intel: bytcr_rt5640: Add quirk for the Estar Beauty HD MID 7316R tablet +- sched/features: Fix hrtick reprogramming +- parisc: Bump 64-bit IRQ stack size to 64 KB +- ASoC: Intel: sof_sdw: detect DMIC number based on mach params +- ASoC: Intel: sof-sdw: indent and add quirks consistently +- perf/x86/kvm: Add Cascade Lake Xeon steppings to isolation_ucodes[] +- btrfs: fix error handling in commit_fs_roots +- ASoC: Intel: Add DMI quirk table to soc_intel_is_byt_cr() +- nvme-tcp: add clean action for failed reconnection +- nvme-rdma: add clean action for failed reconnection +- nvme-core: add cancel tagset helpers +- f2fs: fix to set/clear I_LINKABLE under i_lock +- f2fs: handle unallocated section and zone on pinned/atgc +- media: uvcvideo: Allow entities with no pads +- drm/amd/amdgpu: add error handling to amdgpu_virt_read_pf2vf_data +- drm/amd/display: Guard against NULL pointer deref when get_i2c_info fails +- ASoC: Intel: bytcr_rt5640: Add new BYT_RT5640_NO_SPEAKERS quirk-flag +- PCI: Add a REBAR size quirk for Sapphire RX 5600 XT Pulse +- drm/amdgpu: Add check to prevent IH overflow +- fs: make unlazy_walk() error handling consistent +- crypto: tcrypt - avoid signed overflow in byte count +- drm/hisilicon: Fix use-after-free +- brcmfmac: Add DMI nvram filename quirk for Voyo winpad A15 tablet +- brcmfmac: Add DMI nvram filename quirk for Predia Basic tablet +- staging: bcm2835-audio: Replace unsafe strcpy() with strscpy() +- staging: most: sound: add sanity check for function argument +- Bluetooth: Fix null pointer dereference in amp_read_loc_assoc_final_data +- Bluetooth: Add new HCI_QUIRK_NO_SUSPEND_NOTIFIER quirk +- net: sfp: add mode quirk for GPON module Ubiquiti U-Fiber Instant +- ath10k: fix wmi mgmt tx queue full due to race condition +- pktgen: fix misuse of BUG_ON() in pktgen_thread_worker() +- mt76: mt7615: reset token when mac_reset happens +- Bluetooth: btusb: fix memory leak on suspend and resume +- Bluetooth: hci_h5: Set HCI_QUIRK_SIMULTANEOUS_DISCOVERY for btrtl +- wlcore: Fix command execute failure 19 for wl12xx +- vt/consolemap: do font sum unsigned +- x86/reboot: Add Zotac ZBOX CI327 nano PCI reboot quirk +- staging: fwserial: Fix error handling in fwserial_create +- EDAC/amd64: Do not load on family 0x15, model 0x13 +- rsi: Move card interrupt handling to RX thread +- rsi: Fix TX EAPOL packet handling against iwlwifi AP +- ASoC: qcom: Remove useless debug print +- dt-bindings: net: btusb: DT fix s/interrupt-name/interrupt-names/ +- dt-bindings: ethernet-controller: fix fixed-link specification +- net: fix dev_ifsioc_locked() race condition +- net: psample: Fix netlink skb length with tunnel info +- net: hsr: add support for EntryForgetTime +- net: ag71xx: remove unnecessary MTU reservation +- net: dsa: tag_rtl4_a: Support also egress tags +- net/sched: cls_flower: Reject invalid ct_state flags rules +- net: bridge: use switchdev for port flags set through sysfs too +- mptcp: do not wakeup listener for MPJ subflows +- tcp: fix tcp_rmem documentation +- RDMA/rtrs-srv: Do not signal REG_MR +- RDMA/rtrs-clt: Use bitmask to check sess->flags +- RDMA/rtrs: Do not signal for heatbeat +- mm/hugetlb.c: fix unnecessary address expansion of pmd sharing +- nbd: handle device refs for DESTROY_ON_DISCONNECT properly +- riscv: Get rid of MAX_EARLY_MAPPING_SIZE +- net: fix up truesize of cloned skb in skb_prepare_for_shift() +- tomoyo: ignore data race while checking quota +- smackfs: restrict bytes count in smackfs write functions +- net/af_iucv: remove WARN_ONCE on malformed RX packets +- xfs: Fix assert failure in xfs_setattr_size() +- media: v4l2-ctrls.c: fix shift-out-of-bounds in std_validate +- erofs: fix shift-out-of-bounds of blkszbits +- media: mceusb: sanity check for prescaler value +- udlfb: Fix memory leak in dlfb_usb_probe +- sched/core: Allow try_invoke_on_locked_down_task() with irqs disabled +- JFS: more checks for invalid superblock +- x86/build: Treat R_386_PLT32 relocation as R_386_PC32 +- drm/virtio: use kvmalloc for large allocations +- Input: elan_i2c - add new trackpoint report type 0x5F +- Input: elantech - fix protocol errors for some trackpoints in SMBus mode +- net: usb: qmi_wwan: support ZTE P685M modem +- ARM: dts: aspeed: Add LCLK to lpc-snoop +- net_sched: fix RTNL deadlock again caused by request_module() +- net: qrtr: Fix memory leak in qrtr_tun_open +- net: sched: fix police ext initialization +- wireguard: queueing: get rid of per-peer ring buffers +- wireguard: selftests: test multiple parallel streams +- net: icmp: pass zeroed opts from icmp{,v6}_ndo_send before sending +- ipv6: silence compilation warning for non-IPV6 builds +- kgdb: fix to kill breakpoints on initmem after boot +- drm/i915: Reject 446-480MHz HDMI clock on GLK +- dm era: only resize metadata in preresume +- dm era: Reinitialize bitset cache before digesting a new writeset +- dm era: Use correct value size in equality function of writeset tree +- dm era: Fix bitset memory leaks +- dm era: Verify the data block size hasn't changed +- dm era: Update in-core bitset after committing the metadata +- dm era: Recover committed writeset after crash +- dm writecache: fix writing beyond end of underlying device when shrinking +- dm writecache: return the exact table values that were set +- dm writecache: fix performance degradation in ssd mode +- dm table: fix zoned iterate_devices based device capability checks +- dm table: fix DAX iterate_devices based device capability checks +- dm table: fix iterate_devices based device capability checks +- dm: fix deadlock when swapping to encrypted device +- gfs2: Recursive gfs2_quota_hold in gfs2_iomap_end +- gfs2: Lock imbalance on error path in gfs2_recover_one +- gfs2: Don't skip dlm unlock if glock has an lvb +- gfs2: fix glock confusion in function signal_our_withdraw +- spi: spi-synquacer: fix set_cs handling +- spi: fsl: invert spisel_boot signal on MPC8309 +- sparc32: fix a user-triggerable oops in clear_user() +- f2fs: flush data when enabling checkpoint back +- f2fs: enforce the immutable flag on open files +- f2fs: fix out-of-repair __setattr_copy() +- irqchip/loongson-pch-msi: Use bitmap_zalloc() to allocate bitmap +- um: defer killing userspace on page table update failures +- um: mm: check more comprehensively for stub changes +- virtio/s390: implement virtio-ccw revision 2 correctly +- s390/vtime: fix inline assembly clobber list +- proc: don't allow async path resolution of /proc/thread-self components +- cpufreq: intel_pstate: Get per-CPU max freq via MSR_HWP_CAPABILITIES if available +- cpufreq: intel_pstate: Change intel_pstate_get_hwp_max() argument +- cpufreq: qcom-hw: drop devm_xxx() calls from init/exit hooks +- thermal: cpufreq_cooling: freq_qos_update_request() returns < 0 on error +- kcmp: Support selection of SYS_kcmp without CHECKPOINT_RESTORE +- zonefs: Fix file size of zones in full condition +- exfat: fix shift-out-of-bounds in exfat_fill_super() +- printk: fix deadlock when kernel panic +- mfd: gateworks-gsc: Fix interrupt type +- gpio: pcf857x: Fix missing first interrupt +- mei: me: add adler lake point LP DID +- mei: me: add adler lake point S DID +- mei: me: emmitsburg workstation DID +- mei: fix transfer over dma with extended header +- spmi: spmi-pmic-arb: Fix hw_irq overflow +- powerpc/32s: Add missing call to kuep_lock on syscall entry +- powerpc/kexec_file: fix FDT size estimation for kdump kernel +- powerpc/32: Preserve cr1 in exception prolog stack check to fix build error +- mmc: sdhci-pci-o2micro: Bug fix for SDR104 HW tuning failure +- mmc: sdhci-esdhc-imx: fix kernel panic when remove module +- module: Ignore _GLOBAL_OFFSET_TABLE_ when warning for undefined symbols +- nvmem: qcom-spmi-sdam: Fix uninitialized pdev pointer +- KVM: nSVM: fix running nested guests when npt=0 +- mm, compaction: make fast_isolate_freepages() stay within zone +- mm/vmscan: restore zone_reclaim_mode ABI +- hugetlb: fix copy_huge_page_from_user contig page struct assumption +- hugetlb: fix update_and_free_page contig page struct assumption +- mm: memcontrol: fix get_active_memcg return value +- mm: memcontrol: fix swap undercounting in cgroup2 +- x86: fix seq_file iteration for pat/memtype.c +- seq_file: document how per-entry resources are managed. +- fs/affs: release old buffer head on error path +- mtd: spi-nor: hisi-sfc: Put child node np on error path +- mtd: spi-nor: core: Add erase size check for erase command initialization +- mtd: spi-nor: core: Fix erase type discovery for overlaid region +- mtd: spi-nor: sfdp: Fix wrong erase type bitmask for overlaid region +- mtd: spi-nor: sfdp: Fix last erase region marking +- coresight: etm4x: Handle accesses to TRCSTALLCTLR +- watchdog: mei_wdt: request stop on unregister +- watchdog: qcom: Remove incorrect usage of QCOM_WDT_ENABLE_IRQ +- riscv: Disable KSAN_SANITIZE for vDSO +- arm64: spectre: Prevent lockdep splat on v4 mitigation enable path +- arm64 module: set plt* section addresses to 0x0 +- arm64: uprobe: Return EOPNOTSUPP for AARCH32 instruction probing +- arm64: kexec_file: fix memory leakage in create_dtb() when fdt_open_into() fails +- iommu/arm-smmu-qcom: Fix mask extraction for bootloader programmed SMRs +- arm64: Extend workaround for erratum 1024718 to all versions of Cortex-A55 +- kprobes: Fix to delay the kprobes jump optimization +- rcu/nocb: Perform deferred wake up before last idle's need_resched() check +- rcu: Pull deferred rcuog wake up to rcu_eqs_enter() callers +- powerpc/prom: Fix "ibm,arch-vec-5-platform-support" scan +- x86/entry: Fix instrumentation annotation +- x86/fault: Fix AMD erratum #91 errata fixup for user code +- x86/reboot: Force all cpus to exit VMX root if VMX is supported +- x86/virt: Eat faults on VMXOFF in reboot flows +- media: smipcie: fix interrupt handling and IR timeout +- media: marvell-ccic: power up the device on mclk enable +- media: ipu3-cio2: Fix mbus_code processing in cio2_subdev_set_fmt() +- media: ir_toy: add another IR Droid device +- media: i2c: max9286: fix access to unallocated memory +- floppy: reintroduce O_NDELAY fix +- staging: rtl8188eu: Add Edimax EW-7811UN V2 to device table +- staging: gdm724x: Fix DMA from stack +- staging/mt7621-dma: mtk-hsdma.c->hsdma-mt7621.c +- arm64: dts: agilex: fix phy interface bit shift for gmac1 and gmac2 +- dts64: mt7622: fix slow sd card access +- pstore: Fix typo in compression option name +- drivers/misc/vmw_vmci: restrict too big queue size in qp_host_alloc_queue +- misc: rtsx: init of rts522a add OCP power off when no card is present +- arm64: ptrace: Fix seccomp of traced syscall -1 (NO_SYSCALL) +- seccomp: Add missing return in non-void function +- soc: samsung: exynos-asv: handle reading revision register error +- soc: samsung: exynos-asv: don't defer early on not-supported SoCs +- crypto: sun4i-ss - initialize need_fallback +- crypto: sun4i-ss - handle BigEndian for cipher +- crypto: sun4i-ss - IV register does not work on A10 and A13 +- crypto: sun4i-ss - checking sg length is not sufficient +- crypto: michael_mic - fix broken misalignment handling +- crypto: aesni - prevent misaligned buffers on the stack +- crypto: arm64/sha - add missing module aliases +- drm/i915/gt: Correct surface base address for renderclear +- drm/i915/gt: Flush before changing register state +- btrfs: fix extent buffer leak on failure to copy root +- btrfs: account for new extents being deleted in total_bytes_pinned +- btrfs: handle space_info::total_bytes_pinned inside the delayed ref itself +- btrfs: splice remaining dirty_bg's onto the transaction dirty bg list +- btrfs: fix reloc root leak with 0 ref reloc roots on recovery +- btrfs: abort the transaction if we fail to inc ref in btrfs_copy_root +- btrfs: add asserts for deleting backref cache nodes +- btrfs: do not warn if we can't find the reloc root when looking up backref +- btrfs: do not cleanup upper nodes in btrfs_backref_cleanup_node +- KEYS: trusted: Reserve TPM for seal and unseal operations +- KEYS: trusted: Fix migratable=1 failing +- KEYS: trusted: Fix incorrect handling of tpm_get_random() +- tpm_tis: Clean up locality release +- tpm_tis: Fix check_locality for correct locality acquisition +- erofs: initialized fields can only be observed after bit is set +- selinux: fix inconsistency between inode_getxattr and inode_listsecurity +- ASoC: siu: Fix build error by a wrong const prefix +- drm/rockchip: Require the YTR modifier for AFBC +- drm/panel: kd35t133: allow using non-continuous dsi clock +- drm/sched: Cancel and flush all outstanding jobs before finish. +- drm/modes: Switch to 64bit maths to avoid integer overflow +- drm/nouveau/kms: handle mDP connectors +- drm/amdgpu: Set reference clock to 100Mhz on Renoir (v2) +- drm/amdkfd: Fix recursive lock warnings +- drm/amd/display: Add vupdate_no_lock interrupts for DCN2.1 +- drm/amd/display: Remove Assert from dcn10_get_dig_frontend +- drm/amd/display: Add FPU wrappers to dcn21_validate_bandwidth() +- Revert "drm/amd/display: Update NV1x SR latency values" +- bcache: Move journal work to new flush wq +- bcache: Give btree_io_wq correct semantics again +- Revert "bcache: Kill btree_io_wq" +- Revert "MIPS: Octeon: Remove special handling of CONFIG_MIPS_ELF_APPENDED_DTB=y" +- MIPS: VDSO: Use CLANG_FLAGS instead of filtering out '--target=' +- MIPS: Support binutils configured with --enable-mips-fix-loongson3-llsc=yes +- MIPS: Ingenic: Disable HPTLB for D0 XBurst CPUs too +- ALSA: hda/realtek: Quirk for HP Spectre x360 14 amp setup +- ALSA: hda/realtek: modify EAPD in the ALC886 +- ALSA: hda/hdmi: Drop bogus check at closing a stream +- ALSA: hda: Add another CometLake-H PCI ID +- ALSA: fireface: fix to parse sync status register of latter protocol +- phy: lantiq: rcu-usb2: wait after clock enable +- USB: serial: mos7720: fix error code in mos7720_write() +- USB: serial: mos7840: fix error code in mos7840_write() +- USB: serial: pl2303: fix line-speed handling on newer chips +- USB: serial: ftdi_sio: fix FTX sub-integer prescaler +- usb: dwc3: gadget: Fix dep->interval for fullspeed interrupt +- usb: dwc3: gadget: Fix setting of DEPCFG.bInterval_m1 +- usb: musb: Fix runtime PM race in musb_queue_resume_work +- USB: serial: option: update interface mapping for ZTE P685M +- media: mceusb: Fix potential out-of-bounds shift +- Input: i8042 - add ASUS Zenbook Flip to noselftest list +- Input: joydev - prevent potential read overflow in ioctl +- Input: xpad - add support for PowerA Enhanced Wired Controller for Xbox Series X|S +- Input: raydium_ts_i2c - do not send zero length +- HID: wacom: Ignore attempts to overwrite the touch_max value from HID +- HID: logitech-dj: add support for keyboard events in eQUAD step 4 Gaming +- cpufreq: ACPI: Set cpuinfo.max_freq directly if max boost is known +- ACPI: configfs: add missing check after configfs_register_default_group() +- ACPI: property: Fix fwnode string properties matching +- soundwire: intel: fix possible crash when no device is detected +- blk-settings: align max_sectors on "logical_block_size" boundary +- scsi: sd: Fix Opal support +- ide/falconide: Fix module unload +- block: reopen the device in blkdev_reread_part +- scsi: sd: sd_zbc: Don't pass GFP_NOIO to kvcalloc +- scsi: bnx2fc: Fix Kconfig warning & CNIC build errors +- csky: Fix a size determination in gpr_get() +- proc: use kvzalloc for our kernel buffer +- mm/rmap: fix potential pte_unmap on an not mapped pte +- mm: fix memory_failure() handling of dax-namespace metadata +- mm,thp,shmem: make khugepaged obey tmpfs mount flags +- i2c: exynos5: Preserve high speed master code +- i2c: brcmstb: Fix brcmstd_send_i2c_cmd condition +- arm64: Add missing ISB after invalidating TLB in __primary_switch +- KVM: x86/mmu: Expand collapsible SPTE zap for TDP MMU to ZONE_DEVICE and HugeTLB pages +- KVM: SVM: Intercept INVPCID when it's disabled to inject #UD +- NFSv4: Fixes for nfs4_bitmask_adjust() +- r8169: fix jumbo packet handling on RTL8168e +- mm/compaction: fix misbehaviors of fast_find_migrateblock() +- mm/hugetlb: suppress wrong warning info when alloc gigantic page +- mm/hugetlb: fix potential double free in hugetlb_register_node() error path +- mm/memory.c: fix potential pte_unmap_unlock pte error +- mm: memcontrol: fix slub memory accounting +- mm: memcontrol: fix NR_ANON_THPS accounting in charge moving +- ocfs2: fix a use after free on error +- wireguard: kconfig: use arm chacha even with no neon +- wireguard: device: do not generate ICMP for non-IP packets +- vxlan: move debug check after netdev unregister +- PCI: rockchip: Make 'ep-gpios' DT property optional +- net/mlx4_core: Add missed mlx4_free_cmd_mailbox() +- net: stmmac: fix CBS idleslope and sendslope calculation +- ice: update the number of available RSS queues +- ice: Fix state bits on LLDP mode switch +- ice: Account for port VLAN in VF max packet size calculation +- ice: report correct max number of TCs +- vfio/type1: Use follow_pte() +- pwm: iqs620a: Fix overflow and optimize calculations +- octeontx2-af: Fix an off by one in rvu_dbg_qsize_write() +- i40e: Fix add TC filter for IPv6 +- nios2: fixed broken sys_clone syscall +- Take mmap lock in cacheflush syscall +- i40e: Fix VFs not created +- i40e: Fix addition of RX filters after enabling FW LLDP agent +- i40e: Fix overwriting flow control settings during driver loading +- i40e: Add zero-initialization of AQ command structures +- i40e: Fix flow for IPv6 next header (extension header) +- PCI: cadence: Fix DMA range mapping early return error +- PCI: pci-bridge-emul: Fix array overruns, improve safety +- device-dax: Fix default return code of range_parse() +- mailbox: sprd: correct definition of SPRD_OUTBOX_FIFO_FULL +- ext: EXT4_KUNIT_TESTS should depend on EXT4_FS instead of selecting it +- regmap: sdw: use _no_pm functions in regmap_read/write +- remoteproc/mediatek: acknowledge watchdog IRQ after handled +- misc: fastrpc: fix incorrect usage of dma_map_sgtable +- soundwire: bus: fix confusion on device used by pm_runtime +- soundwire: export sdw_write/read_no_pm functions +- soundwire: bus: use sdw_write_no_pm when setting the bus scale registers +- soundwire: bus: use sdw_update_no_pm when initializing a device +- nvmem: core: skip child nodes not matching binding +- nvmem: core: Fix a resource leak on error in nvmem_add_cells_from_of() +- coresight: etm4x: Skip accessing TRCPDCR in save/restore +- phy: USB_LGM_PHY should depend on X86 +- ext4: fix potential htree index checksum corruption +- vfio-pci/zdev: fix possible segmentation fault issue +- vfio/iommu_type1: Fix some sanity checks in detach group +- vfio/iommu_type1: Populate full dirty when detach non-pinned group +- drm/msm/dp: trigger unplug event in msm_dp_display_disable +- drm/msm: Fix races managing the OOB state for timestamp vs timestamps. +- drm/msm: Fix race of GPU init vs timestamp power management. +- drm/msm/mdp5: Fix wait-for-commit for cmd panels +- drm/msm/dsi: Correct io_start for MSM8994 (20nm PHY) +- drm/msm: Fix MSM_INFO_GET_IOVA with carveout +- mei: hbm: call mei_set_devstate() on hbm stop response +- PCI: Align checking of syscall user config accessors +- VMCI: Use set_page_dirty_lock() when unregistering guest memory +- PCI: xilinx-cpm: Fix reference count leak on error path +- pwm: rockchip: Eliminate potential race condition when probing +- pwm: rockchip: rockchip_pwm_probe(): Remove superfluous clk_unprepare() +- pwm: rockchip: Enable APB clock during register access while probing +- soundwire: cadence: fix ACK/NAK handling +- PCI: rcar: Always allocate MSI addresses in 32bit space +- misc: eeprom_93xx46: Add module alias to avoid breaking support for non device tree users +- phy: cadence-torrent: Fix error code in cdns_torrent_phy_probe() +- phy: rockchip-emmc: emmc_phy_init() always return 0 +- misc: eeprom_93xx46: Fix module alias to enable module autoprobe +- ARM: 9065/1: OABI compat: fix build when EPOLL is not enabled +- Input: zinitix - fix return type of zinitix_init_touch() +- sparc: fix led.c driver when PROC_FS is not enabled +- sparc64: only select COMPAT_BINFMT_ELF if BINFMT_ELF is set +- Input: elo - fix an error code in elo_connect() +- perf test: Fix unaligned access in sample parsing test +- perf intel-pt: Fix IPC with CYC threshold +- perf intel-pt: Fix premature IPC +- perf intel-pt: Fix missing CYC processing in PSB +- perf record: Fix continue profiling after draining the buffer +- Input: sur40 - fix an error code in sur40_probe() +- RDMA/rtrs-srv: Do not pass a valid pointer to PTR_ERR() +- RDMA/rtrs-srv-sysfs: fix missing put_device +- RDMA/rtrs-srv: fix memory leak by missing kobject free +- RDMA/rtrs: Only allow addition of path to an already established session +- RDMA/rtrs-srv: Fix stack-out-of-bounds +- RDMA/ucma: Fix use-after-free bug in ucma_create_uevent +- RDMA/hns: Fixes missing error code of CMDQ +- ceph: fix flush_snap logic after putting caps +- svcrdma: Hold private mutex while invoking rdma_accept() +- nfsd: register pernet ops last, unregister first +- perf symbols: Fix return value when loading PE DSO +- printk: avoid prb_first_valid_seq() where possible +- spi: Skip zero-length transfers in spi_transfer_one_message() +- spi: dw: Avoid stack content exposure +- regulator: bd718x7, bd71828, Fix dvs voltage levels +- perf symbols: Use (long) for iterator for bfd symbols +- selftests/ftrace: Update synthetic event syntax errors +- clk: aspeed: Fix APLL calculate formula from ast2600-A2 +- regulator: qcom-rpmh: fix pm8009 ldo7 +- powerpc/kuap: Restore AMR after replaying soft interrupts +- powerpc/uaccess: Avoid might_fault() when user access is enabled +- spi: pxa2xx: Fix the controller numbering for Wildcat Point +- clk: divider: fix initialization with parent_hw +- RDMA/hns: Disable RQ inline by default +- RDMA/hns: Fix type of sq_signal_bits +- RDMA/siw: Fix calculation of tx_valid_cpus size +- RDMA/hns: Fixed wrong judgments in the goto branch +- kselftests: dmabuf-heaps: Fix Makefile's inclusion of the kernel's usr/include dir +- kunit: tool: fix unit test cleanup handling +- clk: qcom: gcc-msm8998: Fix Alpha PLL type for all GPLLs +- powerpc/8xx: Fix software emulation interrupt +- powerpc/pseries/dlpar: handle ibm, configure-connector delay status +- mfd: wm831x-auxadc: Prevent use after free in wm831x_auxadc_read_irq() +- mfd: altera-sysmgr: Fix physical address storing more +- spi: stm32: properly handle 0 byte transfer +- RDMA/rxe: Correct skb on loopback path +- RDMA/rxe: Fix coding error in rxe_rcv_mcast_pkt +- RDMA/rxe: Fix coding error in rxe_recv.c +- perf vendor events arm64: Fix Ampere eMag event typo +- perf tools: Fix DSO filtering when not finding a map for a sampled address +- rtc: zynqmp: depend on HAS_IOMEM +- tracepoint: Do not fail unregistering a probe due to memory failure +- IB/cm: Avoid a loop when device has 255 ports +- IB/mlx5: Return appropriate error code instead of ENOMEM +- iommu: Properly pass gfp_t in _iommu_map() to avoid atomic sleeping +- iommu: Move iotlb_sync_map out from __iommu_map +- amba: Fix resource leak for drivers without .remove +- i2c: qcom-geni: Store DMA mapping data in geni_i2c_dev struct +- ARM: 9046/1: decompressor: Do not clear SCTLR.nTLSMD for ARMv7+ cores +- mmc: renesas_sdhi_internal_dmac: Fix DMA buffer alignment from 8 to 128-bytes +- mmc: usdhi6rol0: Fix a resource leak in the error handling path of the probe +- mmc: sdhci-sprd: Fix some resource leaks in the remove function +- mmc: owl-mmc: Fix a resource leak in an error handling path and in the remove function +- powerpc/time: Enable sched clock for irqtime +- powerpc/47x: Disable 256k page size +- KVM: PPC: Make the VMX instruction emulation routines static +- IB/umad: Return EPOLLERR in case of when device disassociated +- IB/umad: Return EIO in case of when device disassociated +- iommu: Switch gather->end to the inclusive end +- scsi: lpfc: Fix ancient double free +- objtool: Fix ".cold" section suffix check for newer versions of GCC +- objtool: Fix retpoline detection in asm code +- objtool: Fix error handling for STD/CLD warnings +- auxdisplay: ht16k33: Fix refresh rate handling +- watchdog: intel-mid_wdt: Postpone IRQ handler registration till SCU is ready +- isofs: release buffer head before return +- regulator: core: Avoid debugfs: Directory ... already present! error +- power: supply: smb347-charger: Fix interrupt usage if interrupt is unavailable +- power: supply: axp20x_usb_power: Init work before enabling IRQs +- regulator: s5m8767: Drop regulators OF node reference +- spi: atmel: Put allocated master before return +- regulator: s5m8767: Fix reference count leak +- certs: Fix blacklist flag type confusion +- watch_queue: Drop references to /dev/watch_queue +- regulator: axp20x: Fix reference cout leak +- platform/chrome: cros_ec_proto: Add LID and BATTERY to default mask +- platform/chrome: cros_ec_proto: Use EC_HOST_EVENT_MASK not BIT +- clk: sunxi-ng: h6: Fix clock divider range on some clocks +- IB/mlx5: Add mutex destroy call to cap_mask_mutex mutex +- RDMA/mlx5: Use the correct obj_id upon DEVX TIR creation +- spi: imx: Don't print error on -EPROBEDEFER +- clocksource/drivers/mxs_timer: Add missing semicolon when DEBUG is defined +- clocksource/drivers/ixp4xx: Select TIMER_OF when needed +- power: supply: fix sbs-charger build, needs REGMAP_I2C +- dmaengine: idxd: set DMA channel to be private +- rtc: s5m: select REGMAP_I2C +- power: reset: at91-sama5d2_shdwc: fix wkupdbc mask +- RDMA/rtrs-srv: Init wr_cnt as 1 +- RDMA/rtrs-clt: Refactor the failure cases in alloc_clt +- RDMA/rtrs-srv: Fix missing wr_cqe +- RDMA/rtrs: Call kobject_put in the failure path +- RDMA/rtrs-clt: Set mininum limit when create QP +- RDMA/rtrs-srv: Use sysfs_remove_file_self for disconnect +- RDMA/rtrs-srv: Release lock before call into close_sess +- RDMA/rtrs: Extend ibtrs_cq_qp_create +- of/fdt: Make sure no-map does not remove already reserved regions +- fdt: Properly handle "no-map" field in the memory region +- power: supply: cpcap-charger: Fix power_supply_put on null battery pointer +- power: supply: cpcap-battery: Fix missing power_supply_put() +- power: supply: cpcap-charger: Fix missing power_supply_put() +- mfd: bd9571mwv: Use devm_mfd_add_devices() +- dmaengine: hsu: disable spurious interrupt +- dmaengine: owl-dma: Fix a resource leak in the remove function +- dmaengine: fsldma: Fix a resource leak in an error handling path of the probe function +- dmaengine: fsldma: Fix a resource leak in the remove function +- RDMA/siw: Fix handling of zero-sized Read and Receive Queues. +- HID: core: detect and skip invalid inputs to snto32() +- clk: renesas: r8a779a0: Fix parent of CBFUSA clock +- clk: renesas: r8a779a0: Remove non-existent S2 clock +- clk: sunxi-ng: h6: Fix CEC clock +- spi: cadence-quadspi: Abort read if dummy cycles required are too many +- i2c: iproc: handle master read request +- i2c: iproc: update slave isr mask (ISR_MASK_SLAVE) +- i2c: iproc: handle only slave interrupts which are enabled +- quota: Fix memory leak when handling corrupted quota file +- arm64: dts: qcom: qrb5165-rb5: fix pm8009 regulators +- regulator: qcom-rpmh-regulator: add pm8009-1 chip revision +- selftests/powerpc: Make the test check in eeh-basic.sh posix compliant +- clk: meson: clk-pll: propagate the error from meson_clk_pll_set_rate() +- clk: meson: clk-pll: make "ret" a signed integer +- clk: meson: clk-pll: fix initializing the old rate (fallback) for a PLL +- power: supply: cpcap: Add missing IRQF_ONESHOT to fix regression +- HSI: Fix PM usage counter unbalance in ssi_hw_init +- capabilities: Don't allow writing ambiguous v3 file capabilities +- drm/amdgpu/display: remove hdcp_srm sysfs on device removal +- smp: Process pending softirqs in flush_smp_call_function_from_idle() +- irqchip/imx: IMX_INTMUX should not default to y, unconditionally +- ubifs: Fix error return code in alloc_wbufs() +- ubifs: replay: Fix high stack usage, again +- ubifs: Fix memleak in ubifs_init_authentication +- jffs2: fix use after free in jffs2_sum_write_data() +- fs/jfs: fix potential integer overflow on shift of a int +- ASoC: simple-card-utils: Fix device module clock +- ima: Free IMA measurement buffer after kexec syscall +- ima: Free IMA measurement buffer on error +- ASoC: SOF: sof-pci-dev: add missing Up-Extreme quirk +- nvmet: set status to 0 in case for invalid nsid +- nvmet: remove extra variable in identify ns +- nvme-multipath: set nr_zones for zoned namespaces +- nvmet-tcp: fix potential race of tcp socket closing accept_work +- nvmet-tcp: fix receive data digest calculation for multiple h2cdata PDUs +- io_uring: fix possible deadlock in io_uring_poll +- crypto: ecdh_helper - Ensure 'len >= secret.len' in decode_key() +- hwrng: timeriomem - Fix cooldown period calculation +- drm/dp_mst: Don't cache EDIDs for physical ports +- drm/lima: fix reference leak in lima_pm_busy +- drm/vc4: hdmi: Update the CEC clock divider on HSM rate change +- drm/vc4: hdmi: Compute the CEC clock divider from the clock rate +- drm/vc4: hdmi: Restore cec physical address on reconnect +- drm/vc4: hdmi: Fix up CEC registers +- drm/vc4: hdmi: Fix register offset with longer CEC messages +- drm/vc4: hdmi: Move hdmi reset to bind +- s390/zcrypt: return EIO when msg retry limit reached +- KVM: x86: Restore all 64 bits of DR6 and DR7 during RSM on x86-64 +- btrfs: fix double accounting of ordered extent for subpage case in btrfs_invalidapge +- btrfs: clarify error returns values in __load_free_space_cache +- ASoC: SOF: debug: Fix a potential issue on string buffer termination +- ASoC: rt5682: Fix panic in rt5682_jack_detect_handler happening during system shutdown +- ASoC: qcom: lpass: Fix i2s ctl register bit map +- locking/lockdep: Avoid unmatched unlock +- ASoC: Intel: sof_sdw: add missing TGL_HDMI quirk for Dell SKU 0A3E +- ASoC: Intel: sof_sdw: add missing TGL_HDMI quirk for Dell SKU 0A5E +- Drivers: hv: vmbus: Avoid use-after-free in vmbus_onoffer_rescind() +- drm/mediatek: Check if fb is null +- KVM: nSVM: Don't strip host's C-bit from guest's CR3 when reading PDPTRs +- ASoC: qcom: Fix typo error in HDMI regmap config callbacks +- f2fs: fix a wrong condition in __submit_bio +- drm/amdgpu: Prevent shift wrapping in amdgpu_read_mask() +- f2fs: fix to avoid inconsistent quota data +- mtd: parsers: afs: Fix freeing the part name memory in failure +- ASoC: codecs: add missing max_register in regmap config +- ASoC: cpcap: fix microphone timeslot mask +- ata: ahci_brcm: Add back regulators management +- mm: proc: Invalidate TLB after clearing soft-dirty page state +- drm/nouveau: bail out of nouveau_channel_new if channel init fails +- crypto: talitos - Fix ctr(aes) on SEC1 +- crypto: talitos - Work around SEC6 ERRATA (AES-CTR mode data size error) +- mtd: parser: imagetag: fix error codes in bcm963xx_parse_imagetag_partitions() +- perf/arm-cmn: Move IRQs when migrating context +- perf/arm-cmn: Fix PMU instance naming +- ASoC: SOF: Intel: hda: cancel D0i3 work during runtime suspend +- ASoC: qcom: lpass-cpu: Remove bit clock state check +- f2fs: compress: fix potential deadlock +- sched/eas: Don't update misfit status if the task is pinned +- media: uvcvideo: Accept invalid bFormatIndex and bFrameIndex values +- media: pxa_camera: declare variable when DEBUG is defined +- media: mtk-vcodec: fix argument used when DEBUG is defined +- media: cx25821: Fix a bug when reallocating some dma memory +- media: qm1d1c0042: fix error return code in qm1d1c0042_init() +- media: atomisp: Fix a buffer overflow in debug code +- media: vidtv: psi: fix missing crc for PMT +- media: lmedm04: Fix misuse of comma +- media: software_node: Fix refcounts in software_node_get_next_child() +- drm/amd/display: Fix HDMI deep color output for DCE 6-11. +- drm/amd/display: Fix 10/12 bpc setup in DCE output bit depth reduction. +- macintosh/adb-iop: Use big-endian autopoll mask +- bsg: free the request before return error code +- drm/amdgpu: toggle on DF Cstate after finishing xgmi injection +- drm/tegra: Fix reference leak when pm_runtime_get_sync() fails +- MIPS: Compare __SYNC_loongson3_war against 0 +- MIPS: properly stop .eh_frame generation +- media: ti-vpe: cal: fix write to unallocated memory +- media: imx7: csi: Fix pad link validation +- media: imx7: csi: Fix regression for parallel cameras on i.MX6UL +- drm/sun4i: tcon: fix inverted DCLK polarity +- sched/fair: Avoid stale CPU util_est value for schedutil in task dequeue +- crypto: bcm - Rename struct device_private to bcm_device_private +- evm: Fix memleak in init_desc +- ASoC: qcom: qdsp6: Move frontend AIFs to q6asm-dai +- ASoC: cs42l56: fix up error handling in probe +- media: aspeed: fix error return code in aspeed_video_setup_video() +- media: tm6000: Fix memleak in tm6000_start_stream +- media: media/pci: Fix memleak in empress_init +- media: em28xx: Fix use-after-free in em28xx_alloc_urbs +- media: vsp1: Fix an error handling path in the probe function +- media: camss: missing error code in msm_video_register() +- media: mtk-vcodec: fix error return code in vdec_vp9_decode() +- media: imx: Fix csc/scaler unregister +- media: imx: Unregister csc/scaler only if registered +- media: i2c: ov5670: Fix PIXEL_RATE minimum value +- media: ipu3-cio2: Build only for x86 +- drm/fourcc: fix Amlogic format modifier masks +- drm/virtio: make sure context is created in gem open +- MIPS: lantiq: Explicitly compare LTQ_EBU_PCC_ISTAT against 0 +- MIPS: c-r4k: Fix section mismatch for loongson2_sc_init +- drm/amdgpu: Fix macro name _AMDGPU_TRACE_H_ in preprocessor if condition +- drm: rcar-du: Fix the return check of of_parse_phandle and of_find_device_by_node +- drm: rcar-du: Fix crash when using LVDS1 clock for CRTC +- drm: rcar-du: Fix PM reference leak in rcar_cmm_enable() +- kcsan: Rewrite kcsan_prandom_u32_max() without prandom_u32_state() +- media: allegro: Fix use after free on error +- hwrng: ingenic - Fix a resource leak in an error handling path +- crypto: arm64/aes-ce - really hide slower algos when faster ones are enabled +- crypto: sun4i-ss - fix kmap usage +- crypto: sun4i-ss - linearize buffers content must be kept +- drm/vc4: hdmi: Take into account the clock doubling flag in atomic_check +- drm/panel: mantix: Tweak init sequence +- drm/fb-helper: Add missed unlocks in setcmap_legacy() +- gma500: clean up error handling in init +- drm/gma500: Fix error return code in psb_driver_load() +- fbdev: aty: SPARC64 requires FB_ATY_CT +- tty: implement read_iter +- tty: convert tty_ldisc_ops 'read()' function to take a kernel pointer +- net: enetc: fix destroyed phylink dereference during unbind +- net: mvneta: Remove per-cpu queue mapping for Armada 3700 +- net: amd-xgbe: Fix network fluctuations when using 1G BELFUSE SFP +- net: amd-xgbe: Reset link when the link never comes back +- net: amd-xgbe: Fix NETDEV WATCHDOG transmit queue timeout warning +- net: amd-xgbe: Reset the PHY rx data path when mailbox command timeout +- net: phy: mscc: adding LCPLL reset to VSC8514 +- net: dsa: felix: don't deinitialize unused ports +- net: dsa: felix: perform teardown in reverse order of setup +- ibmvnic: skip send_request_unmap for timeout reset +- ibmvnic: add memory barrier to protect long term buffer +- bpf: Clear subreg_def for global function return values +- b43: N-PHY: Fix the update of coef for the PHY revision >= 3case +- cxgb4/chtls/cxgbit: Keeping the max ofld immediate data size same in cxgb4 and ulds +- net: axienet: Handle deferred probe on clock properly +- tcp: fix SO_RCVLOWAT related hangs under mem pressure +- selftests: mptcp: fix ACKRX debug message +- bpf: Fix bpf_fib_lookup helper MTU check for SKB ctx +- bpf, devmap: Use GFP_KERNEL for xdp bulk queue allocation +- bpf: Fix an unitialized value in bpf_iter +- libbpf: Ignore non function pointer member in struct_ops +- mac80211: fix potential overflow when multiplying to u32 integers +- net/mlx5e: Check tunnel offload is required before setting SWP +- net/mlx5e: CT: manage the lifetime of the ct entry object +- net/mlx5: Disable devlink reload for lag devices +- net/mlx5: Disallow RoCE on lag device +- net/mlx5: Disallow RoCE on multi port slave device +- net/mlx5: Disable devlink reload for multi port slave device +- net/mlx5e: kTLS, Use refcounts to free kTLS RX priv context +- net/mlx5e: Replace synchronize_rcu with synchronize_net +- net/mlx5: Fix health error state handling +- net/mlx5e: Change interrupt moderation channel params also when channels are closed +- net/mlx5e: Don't change interrupt moderation params when DIM is enabled +- net: phy: consider that suspend2ram may cut off PHY power +- dpaa2-eth: fix memory leak in XDP_REDIRECT +- xen/netback: fix spurious event detection for common event case +- bnxt_en: Fix devlink info's stored fw.psid version format. +- bnxt_en: reverse order of TX disable and carrier off +- ibmvnic: Set to CLOSED state even on error +- selftests/bpf: Convert test_xdp_redirect.sh to bash +- ath9k: fix data bus crash when setting nf_override via debugfs +- iwlwifi: pnvm: increment the pointer before checking the TLV +- iwlwifi: pnvm: set the PNVM again if it was already loaded +- bpf_lru_list: Read double-checked variable once without lock +- iwlwifi: mvm: don't check if CSA event is running before removing +- iwlwifi: mvm: assign SAR table revision to the command later +- iwlwifi: mvm: send stored PPAG command instead of local +- iwlwifi: mvm: store PPAG enabled/disabled flag properly +- iwlwifi: mvm: fix the type we use in the PPAG table validity checks +- soc: aspeed: snoop: Add clock control logic +- ath11k: fix a locking bug in ath11k_mac_op_start() +- ath10k: Fix lockdep assertion warning in ath10k_sta_statistics +- ath10k: Fix suspicious RCU usage warning in ath10k_wmi_tlv_parse_peer_stats_info() +- ARM: at91: use proper asm syntax in pm_suspend +- staging: wfx: fix possible panic with re-queued frames +- optee: simplify i2c access +- ARM: s3c: fix fiq for clang IAS +- iwlwifi: mvm: set enabled in the PPAG command properly +- arm64: dts: meson: fix broken wifi node for Khadas VIM3L +- arm64: dts: msm8916: Fix reserved and rfsa nodes unit address +- soc: qcom: ocmem: don't return NULL in of_get_ocmem +- Bluetooth: btusb: Fix memory leak in btusb_mtk_wmt_recv +- opp: Correct debug message in _opp_add_static_v2() +- arm64: dts: armada-3720-turris-mox: rename u-boot mtd partition to a53-firmware +- ARM: dts: armada388-helios4: assign pinctrl to each fan +- ARM: dts: armada388-helios4: assign pinctrl to LEDs +- can: mcp251xfd: mcp251xfd_probe(): fix errata reference +- arm64: dts: renesas: beacon: Fix EEPROM compatible value +- x86/MSR: Filter MSR writes through X86_IOC_WRMSR_REGS ioctl too +- staging: rtl8723bs: wifi_regd.c: Fix incorrect number of regulatory rules +- usb: dwc2: Make "trimming xfer length" a debug message +- usb: dwc2: Abort transaction after errors with unknown reason +- usb: dwc2: Do not update data length if it is 0 on inbound transfers +- ARM: dts: Configure missing thermal interrupt for 4430 +- memory: ti-aemif: Drop child node when jumping out loop +- Bluetooth: Put HCI device if inquiry procedure interrupts +- Bluetooth: drop HCI device reference before return +- staging: media: atomisp: Fix size_t format specifier in hmm_alloc() debug statemenet +- soc: ti: pm33xx: Fix some resource leak in the error handling paths of the probe function +- soc: qcom: socinfo: Fix an off by one in qcom_show_pmic_model() +- arm64: dts: qcom: sdm845-db845c: Fix reset-pin of ov8856 node +- usb: gadget: u_audio: Free requests only after callback +- ACPICA: Fix exception code class checks +- arm64: dts: rockchip: rk3328: Add clock_in_out property to gmac2phy node +- cpufreq: brcmstb-avs-cpufreq: Fix resource leaks in ->remove() +- cpufreq: brcmstb-avs-cpufreq: Free resources in error path +- arm64: dts: qcom: msm8916-samsung-a2015: Fix sensors +- arm64: dts: allwinner: A64: Limit MMC2 bus frequency to 150 MHz +- arm64: dts: allwinner: H6: Allow up to 150 MHz MMC bus frequency +- arm64: dts: allwinner: Drop non-removable from SoPine/LTS SD card +- arm64: dts: allwinner: H6: properly connect USB PHY to port 0 +- arm64: dts: allwinner: A64: properly connect USB PHY to port 0 +- firmware: arm_scmi: Fix call site of scmi_notification_exit +- bpf: Avoid warning when re-casting __bpf_call_base into __bpf_call_base_args +- bpf: Add bpf_patch_call_args prototype to include/linux/bpf.h +- net: stmmac: dwmac-meson8b: fix enabling the timing-adjustment clock +- arm64: dts: qcom: msm8916-samsung-a5u: Fix iris compatible +- staging: vchiq: Fix bulk transfers on 64-bit builds +- staging: vchiq: Fix bulk userdata handling +- Bluetooth: hci_qca: Fix memleak in qca_controller_memdump +- memory: mtk-smi: Fix PM usage counter unbalance in mtk_smi ops +- arm64: dts: exynos: correct PMIC interrupt trigger level on Espresso +- arm64: dts: exynos: correct PMIC interrupt trigger level on TM2 +- ARM: dts: exynos: correct PMIC interrupt trigger level on Odroid XU3 family +- ARM: dts: exynos: correct PMIC interrupt trigger level on Arndale Octa +- ARM: dts: exynos: correct PMIC interrupt trigger level on Spring +- ARM: dts: exynos: correct PMIC interrupt trigger level on Rinato +- ARM: dts: exynos: correct PMIC interrupt trigger level on Monk +- ARM: dts: exynos: correct PMIC interrupt trigger level on Artik 5 +- arm64: dts: renesas: beacon: Fix audio-1.8V pin enable +- arm64: dts: renesas: beacon kit: Fix choppy Bluetooth Audio +- Bluetooth: Fix initializing response id after clearing struct +- Bluetooth: hci_uart: Fix a race for write_work scheduling +- Bluetooth: btqcomsmd: Fix a resource leak in error handling paths in the probe function +- ath10k: Fix error handling in case of CE pipe init failure +- drm/i915/gt: One more flush for Baytrail clear residuals +- ALSA: pcm: Don't call sync_stop if it hasn't been stopped +- ALSA: pcm: Assure sync with the pending stop operation at suspend +- ALSA: pcm: Call sync_stop at disconnection +- random: fix the RNDRESEEDCRNG ioctl +- vmlinux.lds.h: Define SANTIZER_DISCARDS with CONFIG_GCOV_KERNEL=y +- MIPS: vmlinux.lds.S: add missing PAGE_ALIGNED_DATA() section +- ALSA: usb-audio: Fix PCM buffer allocation in non-vmalloc mode +- bfq: Avoid false bfq queue merging +- virt: vbox: Do not use wait_event_interruptible when called from kernel context +- PCI: Decline to resize resources if boot config must be preserved +- PCI: qcom: Use PHY_REFCLK_USE_PAD only for ipq8064 +- w1: w1_therm: Fix conversion result for negative temperatures +- kdb: Make memory allocations more robust +- scsi: qla2xxx: Fix mailbox Ch erroneous error +- scsi: libsas: docs: Remove notify_ha_event() +- debugfs: do not attempt to create a new file before the filesystem is initalized +- debugfs: be more robust at handling improper input in debugfs_lookup() +- vdpa/mlx5: fix param validation in mlx5_vdpa_get_config() +- vmlinux.lds.h: add DWARF v5 sections +- scripts/recordmcount.pl: support big endian for ARCH sh +- kbuild: fix CONFIG_TRIM_UNUSED_KSYMS build for ppc64 +- cifs: Set CIFS_MOUNT_USE_PREFIX_PATH flag on setting cifs_sb->prepath. +- cxgb4: Add new T6 PCI device id 0x6092 +- NET: usb: qmi_wwan: Adding support for Cinterion MV31 +- drm/xlnx: fix kmemleak by sending vblank_event in atomic_disable +- KVM: Use kvm_pfn_t for local PFN variable in hva_to_pfn_remapped() +- mm: provide a saner PTE walking API for modules +- KVM: do not assume PTE is writable after follow_pfn +- mm: simplify follow_pte{,pmd} +- mm: unexport follow_pte_pmd +- KVM: x86: Zap the oldest MMU pages, not the newest +- hwmon: (dell-smm) Add XPS 15 L502X to fan control blacklist +- arm64: tegra: Add power-domain for Tegra210 HDA +- Bluetooth: btusb: Some Qualcomm Bluetooth adapters stop working +- ntfs: check for valid standard information attribute +- ceph: downgrade warning from mdsmap decode to debug +- usb: quirks: add quirk to start video capture on ELMO L-12F document camera reliable +- USB: quirks: sort quirk entries +- nvme-rdma: Use ibdev_to_node instead of dereferencing ->dma_device +- RDMA: Lift ibdev_to_node from rds to common code +- HID: make arrays usage and value to be the same +- bpf: Fix truncation handling for mod32 dst reg wrt zero +- of: unittest: Fix build on architectures without CONFIG_OF_ADDRESS +- mm: Remove examples from enum zone_type comment +- arm64: mm: Set ZONE_DMA size based on early IORT scan +- arm64: mm: Set ZONE_DMA size based on devicetree's dma-ranges +- of: unittest: Add test for of_dma_get_max_cpu_address() +- of/address: Introduce of_dma_get_max_cpu_address() +- arm64: mm: Move zone_dma_bits initialization into zone_sizes_init() +- arm64: mm: Move reserve_crashkernel() into mem_init() +- rockchip: Make cdn_dp_resume depend on CONFIG_PM_SLEEP +- crypto - shash: reduce minimum alignment of shash_desc structure +- arm32: kaslr: print kaslr offset when kernel panic +- arm32: kaslr: pop visibility when compile decompress boot code as we need relocate BSS by GOT. +- arm32: kaslr: When boot with vxboot, we must adjust dtb address before kaslr_early_init, and store dtb address after init. +- arm: kaslr: Fix memtop calculate, when there is no memory top info, we can't use zero instead it. +- arm32: kaslr: Add missing sections about relocatable +- No idea why this broke ... +- ARM: decompressor: add KASLR support +- ARM: decompressor: explicitly map decompressor binary cacheable +- ARM: kernel: implement randomization of the kernel load address +- arm: vectors: use local symbol names for vector entry points +- ARM: kernel: refer to swapper_pg_dir via its symbol +- ARM: mm: export default vmalloc base address +- ARM: kernel: use PC relative symbol references in suspend/resume code +- ARM: kernel: use PC-relative symbol references in MMU switch code +- ARM: kernel: make vmlinux buildable as a PIE executable +- ARM: kernel: switch to relative exception tables +- arm-soc: various: replace open coded VA->PA calculation of pen_release +- arm-soc: mvebu: replace open coded VA->PA conversion +- arm-soc: exynos: replace open coded VA->PA conversions +- asm-generic: add .data.rel.ro sections to __ro_after_init +- Revert "[Huawei] Microchip Polarfire SoC Clock Driver" +- Revert "[Huawei] RISC-V: Add Microchip PolarFire kconfig option" +- sdei_watchdog: avoid possible false hardlockup +- kprobes/arm64: Blacklist sdei watchdog callback functions +- sdei_watchdog: set secure timer period base on 'watchdog_thresh' +- sdei_watchdog: clear EOI of the secure timer before kdump +- sdei_watchdog: refresh 'last_timestamp' when enabling nmi_watchdog +- watchdog: add nmi_watchdog support for arm64 based on SDEI +- lockup_detector: init lockup detector after all the init_calls +- firmware: arm_sdei: make 'sdei_api_event_disable/enable' public +- firmware: arm_sdei: add interrupt binding api +- watchdog: make hardlockup detect code public +- ARM: hw_breakpoint: Do not directly check the event's overflow_handler hook +- net/hinic: Remove the initialization of the global variable g_uld_info +- media: pwc: Use correct device for DMA +- btrfs: fix crash after non-aligned direct IO write with O_DSYNC +- btrfs: fix backport of 2175bf57dc952 in 5.10.13 +- Bluetooth: btusb: Always fallback to alt 1 for WBS +- tty: protect tty_write from odd low-level tty disciplines +- xen-blkback: fix error handling in xen_blkbk_map() +- xen-scsiback: don't "handle" error by BUG() +- xen-netback: don't "handle" error by BUG() +- xen-blkback: don't "handle" error by BUG() +- xen/arm: don't ignore return errors from set_phys_to_machine +- Xen/gntdev: correct error checking in gntdev_map_grant_pages() +- Xen/gntdev: correct dev_bus_addr handling in gntdev_map_grant_pages() +- Xen/x86: also check kernel mapping in set_foreign_p2m_mapping() +- Xen/x86: don't bail early from clear_foreign_p2m_mapping() +- net: fix proc_fs init handling in af_packet and tls +- net: bridge: Fix a warning when del bridge sysfs +- net: openvswitch: fix TTL decrement exception action execution +- net: sched: incorrect Kconfig dependencies on Netfilter modules +- mt76: mt7615: fix rdd mcu cmd endianness +- mt76: mt7915: fix endian issues +- net/sched: fix miss init the mru in qdisc_skb_cb +- mptcp: skip to next candidate if subflow has unacked data +- net: qrtr: Fix port ID for control messages +- IB/isert: add module param to set sg_tablesize for IO cmd +- vdpa_sim: add get_config callback in vdpasim_dev_attr +- vdpa_sim: make 'config' generic and usable for any device type +- vdpa_sim: store parsed MAC address in a buffer +- vdpa_sim: add struct vdpasim_dev_attr for device attributes +- vdpa_sim: remove hard-coded virtq count +- kcov, usb: only collect coverage from __usb_hcd_giveback_urb in softirq +- ovl: expand warning in ovl_d_real() +- net/qrtr: restrict user-controlled length in qrtr_tun_write_iter() +- net/rds: restrict iovecs length for RDS_CMSG_RDMA_ARGS +- vsock: fix locking in vsock_shutdown() +- vsock/virtio: update credit only if socket is not closed +- switchdev: mrp: Remove SWITCHDEV_ATTR_ID_MRP_PORT_STAT +- bridge: mrp: Fix the usage of br_mrp_port_switchdev_set_state +- net: watchdog: hold device global xmit lock during tx disable +- net/vmw_vsock: improve locking in vsock_connect_timeout() +- net/vmw_vsock: fix NULL pointer dereference +- net: fix iteration for sctp transport seq_files +- net: gro: do not keep too many GRO packets in napi->rx_list +- cpufreq: ACPI: Update arch scale-invariance max perf ratio if CPPC is not there +- cpufreq: ACPI: Extend frequency tables to cover boost frequencies +- net: dsa: call teardown method on probe failure +- udp: fix skb_copy_and_csum_datagram with odd segment sizes +- rxrpc: Fix clearance of Tx/Rx ring when releasing a call +- arm64: mte: Allow PTRACE_PEEKMTETAGS access to the zero page +- x86/pci: Create PCI/MSI irqdomain after x86_init.pci.arch_init() +- scripts: set proper OpenSSL include dir also for sign-file +- h8300: fix PREEMPTION build, TI_PRE_COUNT undefined +- i2c: stm32f7: fix configuration of the digital filter +- clk: sunxi-ng: mp: fix parent rate change flag check +- drm/sun4i: dw-hdmi: Fix max. frequency for H6 +- drm/sun4i: Fix H6 HDMI PHY configuration +- drm/sun4i: dw-hdmi: always set clock rate +- drm/sun4i: tcon: set sync polarity for tcon1 channel +- firmware_loader: align .builtin_fw to 8 +- net: hns3: add a check for index in hclge_get_rss_key() +- net: hns3: add a check for tqp_index in hclge_get_ring_chain_from_mbx() +- net: hns3: add a check for queue_id in hclge_reset_vf_queue() +- net: dsa: felix: implement port flushing on .phylink_mac_link_down +- x86/build: Disable CET instrumentation in the kernel for 32-bit too +- scsi: scsi_debug: Fix a memory leak +- netfilter: conntrack: skip identical origin tuple in same zone only +- ibmvnic: Clear failover_pending if unable to schedule +- net: stmmac: set TxQ mode back to DCB after disabling CBS +- selftests: txtimestamp: fix compilation issue +- net: enetc: initialize the RFS and RSS memories +- hv_netvsc: Reset the RSC count if NVSP_STAT_FAIL in netvsc_receive() +- net: ipa: set error code in gsi_channel_setup() +- net: hdlc_x25: Return meaningful error code in x25_open +- xen/netback: avoid race in xenvif_rx_ring_slots_available() +- netfilter: flowtable: fix tcp and udp header checksum update +- netfilter: nftables: fix possible UAF over chains from packet path in netns +- selftests: netfilter: fix current year +- netfilter: xt_recent: Fix attempt to update deleted entry +- bpf: Check for integer overflow when using roundup_pow_of_two() +- bpf: Unbreak BPF_PROG_TYPE_KPROBE when kprobe is called via do_int3 +- dmaengine: idxd: check device state before issue command +- drm/vc4: hvs: Fix buffer overflow with the dlist handling +- mt76: dma: fix a possible memory leak in mt76_add_fragment() +- ath9k: fix build error with LEDS_CLASS=m +- dmaengine: idxd: fix misc interrupt completion +- cgroup-v1: add disabled controller check in cgroup1_parse_param() +- KVM: x86: cleanup CR3 reserved bits checks +- lkdtm: don't move ctors to .rodata +- x86/efi: Remove EFI PGD build time checks +- Revert "lib: Restrict cpumask_local_spread to houskeeping CPUs" +- ubsan: implement __ubsan_handle_alignment_assumption +- ARM: kexec: fix oops after TLB are invalidated +- ARM: ensure the signal page contains defined contents +- kallsyms: fix nonconverging kallsyms table with lld +- ARM: dts: lpc32xx: Revert set default clock rate of HCLK PLL +- bfq-iosched: Revert "bfq: Fix computation of shallow depth" +- riscv: virt_addr_valid must check the address belongs to linear mapping +- drm/amd/display: Decrement refcount of dc_sink before reassignment +- drm/amd/display: Free atomic state after drm_atomic_commit +- drm/amd/display: Fix dc_sink kref count in emulated_link_detect +- drm/amd/display: Release DSC before acquiring +- drm/amd/display: Add more Clock Sources to DCN2.1 +- drm/amd/display: Fix DPCD translation for LTTPR AUX_RD_INTERVAL +- nvme-pci: ignore the subsysem NQN on Phison E16 +- x86/split_lock: Enable the split lock feature on another Alder Lake CPU +- scsi: lpfc: Fix EEH encountering oops with NVMe traffic +- ovl: skip getxattr of security labels +- cap: fix conversions on getxattr +- ovl: perform vfs_getxattr() with mounter creds +- arm64: dts: rockchip: Disable display for NanoPi R2S +- platform/x86: hp-wmi: Disable tablet-mode reporting by default +- arm64: dts: rockchip: remove interrupt-names property from rk3399 vdec node +- ARM: OMAP2+: Fix suspcious RCU usage splats for omap_enter_idle_coupled +- arm64: dts: qcom: sdm845: Reserve LPASS clocks in gcc +- arm64: dts: rockchip: Fix PCIe DT properties on rk3399 +- soc: ti: omap-prm: Fix boot time errors for rst_map_012 bits 0 and 1 +- tmpfs: disallow CONFIG_TMPFS_INODE64 on alpha +- tmpfs: disallow CONFIG_TMPFS_INODE64 on s390 +- dmaengine: move channel device_node deletion to driver +- drm/dp_mst: Don't report ports connected if nothing is attached to them +- drm/i915/tgl+: Make sure TypeC FIA is powered up when initializing it +- Revert "drm/amd/display: Update NV1x SR latency values" +- cgroup: fix psi monitor for root cgroup +- arm/xen: Don't probe xenbus as part of an early initcall +- drm/i915: Fix overlay frontbuffer tracking +- tracing: Check length before giving out the filter buffer +- tracing: Do not count ftrace events in top level enable output +- gpio: ep93xx: Fix single irqchip with multi gpiochips +- gpio: ep93xx: fix BUG_ON port F usage +- gpio: mxs: GPIO_MXS should not default to y unconditionally +- Revert "dts: phy: add GPIO number and active state used for phy reset" +- objtool: Fix seg fault with Clang non-section symbols +- squashfs: add more sanity checks in xattr id lookup +- squashfs: add more sanity checks in inode lookup +- squashfs: add more sanity checks in id lookup +- squashfs: avoid out of bounds writes in decompressors +- Revert "mm: memcontrol: avoid workload stalls when lowering memory.high" +- nilfs2: make splice write available again +- drm/i915: Skip vswing programming for TBT +- drm/i915: Fix ICL MG PHY vswing handling +- bpf: Fix verifier jsgt branch analysis on max bound +- bpf: Fix 32 bit src register truncation on div/mod +- bpf: Fix verifier jmp32 pruning decision logic +- regulator: Fix lockdep warning resolving supplies +- blk-cgroup: Use cond_resched() when destroy blkgs +- i2c: mediatek: Move suspend and resume handling to NOIRQ phase +- SUNRPC: Handle 0 length opaque XDR object data properly +- SUNRPC: Move simple_get_bytes and simple_get_netobj into private header +- iwlwifi: queue: bail out on invalid freeing +- iwlwifi: mvm: guard against device removal in reprobe +- iwlwifi: pcie: add rules to match Qu with Hr2 +- iwlwifi: mvm: invalidate IDs of internal stations at mvm start +- iwlwifi: pcie: fix context info memory leak +- iwlwifi: pcie: add a NULL check in iwl_pcie_txq_unmap +- iwlwifi: mvm: take mutex for calling iwl_mvm_get_sync_time() +- iwlwifi: mvm: skip power command when unbinding vif during CSA +- ASoC: Intel: sof_sdw: set proper flags for Dell TGL-H SKU 0A5E +- ASoC: ak4458: correct reset polarity +- ALSA: hda: intel-dsp-config: add PCI id for TGL-H +- pNFS/NFSv4: Improve rejection of out-of-order layouts +- pNFS/NFSv4: Try to return invalid layout in pnfs_layout_process() +- chtls: Fix potential resource leak +- ASoC: Intel: Skylake: Zero snd_ctl_elem_value +- mac80211: 160MHz with extended NSS BW in CSA +- drm/nouveau/nvif: fix method count when pushing an array +- ASoC: wm_adsp: Fix control name parsing for multi-fw +- regulator: core: avoid regulator_resolve_supply() race condition +- af_key: relax availability checks for skb size calculation +- powerpc/64/signal: Fix regression in __kernel_sigtramp_rt64() semantics +- gpiolib: cdev: clear debounce period if line set to output +- io_uring: drop mm/files between task_work_submit +- io_uring: reinforce cancel on flush during exit +- io_uring: fix sqo ownership false positive warning +- io_uring: fix list corruption for splice file_get +- io_uring: fix flush cqring overflow list while TASK_INTERRUPTIBLE +- io_uring: fix cancellation taking mutex while TASK_UNINTERRUPTIBLE +- io_uring: replace inflight_wait with tctx->wait +- io_uring: fix __io_uring_files_cancel() with TASK_UNINTERRUPTIBLE +- io_uring: if we see flush on exit, cancel related tasks +- io_uring: account io_uring internal files as REQ_F_INFLIGHT +- io_uring: fix files cancellation +- io_uring: always batch cancel in *cancel_files() +- io_uring: pass files into kill timeouts/poll +- io_uring: don't iterate io_uring_cancel_files() +- io_uring: add a {task,files} pair matching helper +- io_uring: simplify io_task_match() +- net: sched: replaced invalid qdisc tree flush helper in qdisc_replace +- net: dsa: mv88e6xxx: override existent unicast portvec in port_fdb_add +- udp: ipv4: manipulate network header of NATed UDP GRO fraglist +- net: ip_tunnel: fix mtu calculation +- neighbour: Prevent a dead entry from updating gc_list +- igc: Report speed and duplex as unknown when device is runtime suspended +- md: Set prev_flush_start and flush_bio in an atomic way +- Input: ili210x - implement pressure reporting for ILI251x +- Input: xpad - sync supported devices with fork on GitHub +- Input: goodix - add support for Goodix GT9286 chip +- x86/apic: Add extra serialization for non-serializing MSRs +- x86/debug: Prevent data breakpoints on cpu_dr7 +- x86/debug: Prevent data breakpoints on __per_cpu_offset +- x86/debug: Fix DR6 handling +- x86/build: Disable CET instrumentation in the kernel +- mm/filemap: add missing mem_cgroup_uncharge() to __add_to_page_cache_locked() +- mm: thp: fix MADV_REMOVE deadlock on shmem THP +- mm/vmalloc: separate put pages and flush VM flags +- mm, compaction: move high_pfn to the for loop scope +- mm: hugetlb: remove VM_BUG_ON_PAGE from page_huge_active +- mm: hugetlb: fix a race between isolating and freeing page +- mm: hugetlb: fix a race between freeing and dissolving the page +- mm: hugetlbfs: fix cannot migrate the fallocated HugeTLB page +- ARM: 9043/1: tegra: Fix misplaced tegra_uart_config in decompressor +- ARM: footbridge: fix dc21285 PCI configuration accessors +- ARM: dts; gta04: SPI panel chip select is active low +- DTS: ARM: gta04: remove legacy spi-cs-high to make display work again +- KVM: x86: Set so called 'reserved CR3 bits in LM mask' at vCPU reset +- KVM: x86: Update emulator context mode if SYSENTER xfers to 64-bit mode +- KVM: x86: fix CPUID entries returned by KVM_GET_CPUID2 ioctl +- KVM: x86: Allow guests to see MSR_IA32_TSX_CTRL even if tsx=off +- KVM: x86/mmu: Fix TDP MMU zap collapsible SPTEs +- KVM: SVM: Treat SVM as unsupported when running as an SEV guest +- nvme-pci: avoid the deepest sleep state on Kingston A2000 SSDs +- io_uring: don't modify identity's files uncess identity is cowed +- drm/amd/display: Revert "Fix EDID parsing after resume from suspend" +- drm/i915: Power up combo PHY lanes for for HDMI as well +- drm/i915: Extract intel_ddi_power_up_lanes() +- drm/i915/display: Prevent double YUV range correction on HDR planes +- drm/i915/gt: Close race between enable_breadcrumbs and cancel_breadcrumbs +- drm/i915/gem: Drop lru bumping on display unpinning +- drm/i915: Fix the MST PBN divider calculation +- drm/dp/mst: Export drm_dp_get_vc_payload_bw() +- Fix unsynchronized access to sev members through svm_register_enc_region +- mmc: core: Limit retries when analyse of SDIO tuples fails +- mmc: sdhci-pltfm: Fix linking err for sdhci-brcmstb +- smb3: fix crediting for compounding when only one request in flight +- smb3: Fix out-of-bounds bug in SMB2_negotiate() +- iommu: Check dev->iommu in dev_iommu_priv_get() before dereferencing it +- cifs: report error instead of invalid when revalidating a dentry fails +- RISC-V: Define MAXPHYSMEM_1GB only for RV32 +- xhci: fix bounce buffer usage for non-sg list case +- scripts: use pkg-config to locate libcrypto +- genirq/msi: Activate Multi-MSI early when MSI_FLAG_ACTIVATE_EARLY is set +- genirq: Prevent [devm_]irq_alloc_desc from returning irq 0 +- libnvdimm/dimm: Avoid race between probe and available_slots_show() +- libnvdimm/namespace: Fix visibility of namespace resource attribute +- tracepoint: Fix race between tracing and removing tracepoint +- tracing: Use pause-on-trace with the latency tracers +- kretprobe: Avoid re-registration of the same kretprobe earlier +- tracing/kprobe: Fix to support kretprobe events on unloaded modules +- fgraph: Initialize tracing_graph_pause at task creation +- gpiolib: free device name on error path to fix kmemleak +- mac80211: fix station rate table updates on assoc +- ovl: implement volatile-specific fsync error behaviour +- ovl: avoid deadlock on directory ioctl +- ovl: fix dentry leak in ovl_get_redirect +- thunderbolt: Fix possible NULL pointer dereference in tb_acpi_add_link() +- kbuild: fix duplicated flags in DEBUG_CFLAGS +- memblock: do not start bottom-up allocations with kernel_end +- vdpa/mlx5: Restore the hardware used index after change map +- nvmet-tcp: fix out-of-bounds access when receiving multiple h2cdata PDUs +- ARM: dts: sun7i: a20: bananapro: Fix ethernet phy-mode +- net: ipa: pass correct dma_handle to dma_free_coherent() +- r8169: fix WoL on shutdown if CONFIG_DEBUG_SHIRQ is set +- net: mvpp2: TCAM entry enable should be written after SRAM data +- net: lapb: Copy the skb before sending a packet +- net/mlx5e: Release skb in case of failure in tc update skb +- net/mlx5e: Update max_opened_tc also when channels are closed +- net/mlx5: Fix leak upon failure of rule creation +- net/mlx5: Fix function calculation for page trees +- ibmvnic: device remove has higher precedence over reset +- i40e: Revert "i40e: don't report link up for a VF who hasn't enabled queues" +- igc: check return value of ret_val in igc_config_fc_after_link_up +- igc: set the default return value to -IGC_ERR_NVM in igc_write_nvm_srwr +- SUNRPC: Fix NFS READs that start at non-page-aligned offsets +- arm64: dts: ls1046a: fix dcfg address range +- rxrpc: Fix deadlock around release of dst cached on udp tunnel +- r8169: work around RTL8125 UDP hw bug +- arm64: dts: meson: switch TFLASH_VDD_EN pin to open drain on Odroid-C4 +- bpf, preload: Fix build when $(O) points to a relative path +- um: virtio: free vu_dev only with the contained struct device +- bpf, inode_storage: Put file handler if no storage was found +- bpf, cgroup: Fix problematic bounds check +- bpf, cgroup: Fix optlen WARN_ON_ONCE toctou +- vdpa/mlx5: Fix memory key MTT population +- ARM: dts: stm32: Fix GPIO hog flags on DHCOM DRC02 +- ARM: dts: stm32: Disable optional TSC2004 on DRC02 board +- ARM: dts: stm32: Disable WP on DHCOM uSD slot +- ARM: dts: stm32: Connect card-detect signal on DHCOM +- ARM: dts: stm32: Fix polarity of the DH DRC02 uSD card detect +- arm64: dts: rockchip: Use only supported PCIe link speed on Pinebook Pro +- arm64: dts: rockchip: fix vopl iommu irq on px30 +- arm64: dts: amlogic: meson-g12: Set FL-adj property value +- Input: i8042 - unbreak Pegatron C15B +- arm64: dts: qcom: c630: keep both touchpad devices enabled +- ARM: OMAP1: OSK: fix ohci-omap breakage +- usb: xhci-mtk: break loop when find the endpoint to drop +- usb: xhci-mtk: skip dropping bandwidth of unchecked endpoints +- usb: xhci-mtk: fix unreleased bandwidth data +- usb: dwc3: fix clock issue during resume in OTG mode +- usb: dwc2: Fix endpoint direction check in ep_from_windex +- usb: renesas_usbhs: Clear pipe running flag in usbhs_pkt_pop() +- USB: usblp: don't call usb_set_interface if there's a single alt +- usb: gadget: aspeed: add missing of_node_put +- USB: gadget: legacy: fix an error code in eth_bind() +- usb: host: xhci: mvebu: make USB 3.0 PHY optional for Armada 3720 +- USB: serial: option: Adding support for Cinterion MV31 +- USB: serial: cp210x: add new VID/PID for supporting Teraoka AD2000 +- USB: serial: cp210x: add pid/vid for WSDA-200-USB + +* Fri Feb 19 2021 Xie XiuQi - 5.10.0-4.0.0.13 +- net/hinic: Add NIC Layer +- net/hinic: Update Hardware Abstract Layer +- workqueue: Restrict affinity change to rescuer +- kthread: Extract KTHREAD_IS_PER_CPU +- x86/cpu: Add another Alder Lake CPU to the Intel family +- objtool: Don't fail the kernel build on fatal errors +- habanalabs: disable FW events on device removal +- habanalabs: fix backward compatibility of idle check +- habanalabs: zero pci counters packet before submit to FW +- drm/amd/display: Fixed corruptions on HPDRX link loss restore +- drm/amd/display: Use hardware sequencer functions for PG control +- drm/amd/display: Change function decide_dp_link_settings to avoid infinite looping +- drm/amd/display: Allow PSTATE chnage when no displays are enabled +- drm/amd/display: Update dram_clock_change_latency for DCN2.1 +- selftests/powerpc: Only test lwm/stmw on big endian +- platform/x86: thinkpad_acpi: Add P53/73 firmware to fan_quirk_table for dual fan control +- nvmet: set right status on error in id-ns handler +- nvme-pci: allow use of cmb on v1.4 controllers +- nvme-tcp: avoid request double completion for concurrent nvme_tcp_timeout +- nvme-rdma: avoid request double completion for concurrent nvme_rdma_timeout +- nvme: check the PRINFO bit before deciding the host buffer length +- udf: fix the problem that the disc content is not displayed +- i2c: tegra: Create i2c_writesl_vi() to use with VI I2C for filling TX FIFO +- ALSA: hda: Add Cometlake-R PCI ID +- scsi: ibmvfc: Set default timeout to avoid crash during migration +- mac80211: fix encryption key selection for 802.3 xmit +- mac80211: fix fast-rx encryption check +- mac80211: fix incorrect strlen of .write in debugfs +- objtool: Don't add empty symbols to the rbtree +- ALSA: hda: Add AlderLake-P PCI ID and HDMI codec vid +- ASoC: SOF: Intel: hda: Resume codec to do jack detection +- scsi: fnic: Fix memleak in vnic_dev_init_devcmd2 +- scsi: libfc: Avoid invoking response handler twice if ep is already completed +- scsi: scsi_transport_srp: Don't block target in failfast state +- x86: __always_inline __{rd,wr}msr() +- locking/lockdep: Avoid noinstr warning for DEBUG_LOCKDEP +- habanalabs: fix dma_addr passed to dma_mmap_coherent +- platform/x86: intel-vbtn: Support for tablet mode on Dell Inspiron 7352 +- platform/x86: touchscreen_dmi: Add swap-x-y quirk for Goodix touchscreen on Estar Beauty HD tablet +- tools/power/x86/intel-speed-select: Set higher of cpuinfo_max_freq or base_frequency +- tools/power/x86/intel-speed-select: Set scaling_max_freq to base_frequency +- phy: cpcap-usb: Fix warning for missing regulator_disable +- iommu/vt-d: Do not use flush-queue when caching-mode is on +- ARM: 9025/1: Kconfig: CPU_BIG_ENDIAN depends on !LD_IS_LLD +- Revert "x86/setup: don't remove E820_TYPE_RAM for pfn 0" +- arm64: Do not pass tagged addresses to __is_lm_address() +- arm64: Fix kernel address detection of __is_lm_address() +- arm64: dts: meson: Describe G12b GPU as coherent +- drm/panfrost: Support cache-coherent integrations +- iommu/io-pgtable-arm: Support coherency for Mali LPAE +- ibmvnic: Ensure that CRQ entry read are correctly ordered +- net: switchdev: don't set port_obj_info->handled true when -EOPNOTSUPP +- net: dsa: bcm_sf2: put device node before return +- mlxsw: spectrum_span: Do not overwrite policer configuration +- stmmac: intel: Configure EHL PSE0 GbE and PSE1 GbE to 32 bits DMA addressing +- net: octeontx2: Make sure the buffer is 128 byte aligned +- net: fec: put child node on error path +- net: stmmac: dwmac-intel-plat: remove config data on error +- net: dsa: microchip: Adjust reset release timing to match reference reset circuit +- vsock: fix the race conditions in multi-transport support +- tcp: fix TLP timer not set when CA_STATE changes from DISORDER to OPEN +- tcp: make TCP_USER_TIMEOUT accurate for zero window probes +- team: protect features update by RCU to avoid deadlock +- scsi: qla2xxx: Fix description for parameter ql2xenforce_iocb_limit +- ASoC: topology: Fix memory corruption in soc_tplg_denum_create_values() +- ASoC: topology: Properly unregister DAI on removal +- ASoC: mediatek: mt8183-mt6358: ignore TDM DAI link by default +- ASoC: mediatek: mt8183-da7219: ignore TDM DAI link by default +- NFC: fix possible resource leak +- NFC: fix resource leak when target index is invalid +- rxrpc: Fix memory leak in rxrpc_lookup_local +- selftests: forwarding: Specify interface when invoking mausezahn +- nvme-multipath: Early exit if no path is available +- iommu/vt-d: Correctly check addr alignment in qi_flush_dev_iotlb_pasid() +- iommu/amd: Use IVHD EFR for early initialization of IOMMU features +- of/device: Update dma_range_map only when dev has valid dma-ranges +- ACPI/IORT: Do not blindly trust DMA masks from firmware +- can: dev: prevent potential information leak in can_fill_info() +- net/mlx5: CT: Fix incorrect removal of tuple_nat_node from nat rhashtable +- net/mlx5e: Revert parameters on errors when changing MTU and LRO state without reset +- net/mlx5e: Revert parameters on errors when changing trust state without reset +- net/mlx5e: Correctly handle changing the number of queues when the interface is down +- net/mlx5e: Fix CT rule + encap slow path offload and deletion +- net/mlx5e: Disable hw-tc-offload when MLX5_CLS_ACT config is disabled +- net/mlx5: Maintain separate page trees for ECPF and PF functions +- net/mlx5e: Reduce tc unsupported key print level +- net/mlx5e: free page before return +- net/mlx5e: E-switch, Fix rate calculation for overflow +- net/mlx5: Fix memory leak on flow table creation error flow +- igc: fix link speed advertising +- i40e: acquire VSI pointer only after VF is initialized +- ice: Fix MSI-X vector fallback logic +- ice: Don't allow more channels than LAN MSI-X available +- ice: update dev_addr in ice_set_mac_address even if HW filter exists +- ice: Implement flow for IPv6 next header (extension header) +- ice: fix FDir IPv6 flexbyte +- mac80211: pause TX while changing interface type +- iwlwifi: pcie: reschedule in long-running memory reads +- iwlwifi: pcie: use jiffies for memory read spin time limit +- iwlwifi: pcie: set LTR on more devices +- iwlwifi: pnvm: don't try to load after failures +- iwlwifi: pnvm: don't skip everything when not reloading +- iwlwifi: pcie: avoid potential PNVM leaks +- ASoC: qcom: lpass: Fix out-of-bounds DAI ID lookup +- ASoC: SOF: Intel: soundwire: fix select/depend unmet dependencies +- pNFS/NFSv4: Update the layout barrier when we schedule a layoutreturn +- pNFS/NFSv4: Fix a layout segment leak in pnfs_layout_process() +- powerpc/64s: prevent recursive replay_soft_interrupts causing superfluous interrupt +- ASoC: Intel: Skylake: skl-topology: Fix OOPs ib skl_tplg_complete +- spi: altera: Fix memory leak on error path +- ASoC: qcom: lpass-ipq806x: fix bitwidth regmap field +- ASoC: qcom: Fix broken support to MI2S TERTIARY and QUATERNARY +- ASoC: qcom: Fix incorrect volatile registers +- ASoC: dt-bindings: lpass: Fix and common up lpass dai ids +- RDMA/cxgb4: Fix the reported max_recv_sge value +- firmware: imx: select SOC_BUS to fix firmware build +- arm64: dts: imx8mp: Correct the gpio ranges of gpio3 +- ARM: dts: imx6qdl-sr-som: fix some cubox-i platforms +- ARM: dts: imx6qdl-kontron-samx6i: fix i2c_lcd/cam default status +- ARM: imx: fix imx8m dependencies +- arm64: dts: ls1028a: fix the offset of the reset register +- xfrm: Fix wraparound in xfrm_policy_addr_delta() +- selftests: xfrm: fix test return value override issue in xfrm_policy.sh +- xfrm: fix disable_xfrm sysctl when used on xfrm interfaces +- xfrm: Fix oops in xfrm_replay_advance_bmp +- Revert "block: simplify set_init_blocksize" to regain lost performance +- Revert "RDMA/mlx5: Fix devlink deadlock on net namespace deletion" +- netfilter: nft_dynset: add timeout extension to template +- ARM: zImage: atags_to_fdt: Fix node names on added root nodes +- ARM: imx: build suspend-imx6.S with arm instruction set +- clk: qcom: gcc-sm250: Use floor ops for sdcc clks +- clk: mmp2: fix build without CONFIG_PM +- clk: imx: fix Kconfig warning for i.MX SCU clk +- blk-mq: test QUEUE_FLAG_HCTX_ACTIVE for sbitmap_shared in hctx_may_queue +- xen-blkfront: allow discard-* nodes to be optional +- tee: optee: replace might_sleep with cond_resched +- KVM: Documentation: Fix spec for KVM_CAP_ENABLE_CAP_VM +- uapi: fix big endian definition of ipv6_rpl_sr_hdr +- drm/i915/selftest: Fix potential memory leak +- drm/i915: Check for all subplatform bits +- drm/nouveau/dispnv50: Restore pushing of all data. +- drm/vc4: Correct POS1_SCL for hvs5 +- drm/vc4: Correct lbm size and calculation +- drm/nouveau/svm: fail NOUVEAU_SVM_INIT ioctl on unsupported devices +- ARM: dts: imx6qdl-kontron-samx6i: fix pwms for lcd-backlight +- net/mlx5e: Fix IPSEC stats +- drm/i915/pmu: Don't grab wakeref when enabling events +- drm/i915/gt: Clear CACHE_MODE prior to clearing residuals +- iwlwifi: Fix IWL_SUBDEVICE_NO_160 macro to use the correct bit. +- mt7601u: fix rx buffer refcounting +- mt76: mt7663s: fix rx buffer refcounting +- mt7601u: fix kernel crash unplugging the device +- arm64: dts: broadcom: Fix USB DMA address translation for Stingray +- leds: trigger: fix potential deadlock with libata +- xen: Fix XenStore initialisation for XS_LOCAL +- io_uring: fix wqe->lock/completion_lock deadlock +- KVM: Forbid the use of tagged userspace addresses for memslots +- KVM: x86: get smi pending status correctly +- KVM: nVMX: Sync unsync'd vmcs02 state to vmcs12 on migration +- KVM: x86: allow KVM_REQ_GET_NESTED_STATE_PAGES outside guest mode for VMX +- KVM: nSVM: cancel KVM_REQ_GET_NESTED_STATE_PAGES on nested vmexit +- KVM: arm64: Filter out v8.1+ events on v8.0 HW +- KVM: x86/pmu: Fix UBSAN shift-out-of-bounds warning in intel_pmu_refresh() +- KVM: x86/pmu: Fix HW_REF_CPU_CYCLES event pseudo-encoding in intel_arch_events[] +- btrfs: fix possible free space tree corruption with online conversion +- btrfs: fix lockdep warning due to seqcount_mutex on 32bit arch +- drivers: soc: atmel: add null entry at the end of at91_soc_allowed_list[] +- drivers: soc: atmel: Avoid calling at91_soc_init on non AT91 SoCs +- crypto: marvel/cesa - Fix tdma descriptor on 64-bit +- efi/apple-properties: Reinstate support for boolean properties +- x86/entry: Emit a symbol for register restoring thunk +- PM: hibernate: flush swap writer after marking +- s390/vfio-ap: No need to disable IRQ after queue reset +- s390: uv: Fix sysfs max number of VCPUs reporting +- net: usb: qmi_wwan: added support for Thales Cinterion PLSx3 modem family +- bcache: only check feature sets when sb->version >= BCACHE_SB_VERSION_CDEV_WITH_FEATURES +- drivers/nouveau/kms/nv50-: Reject format modifiers for cursor planes +- drm/i915/gt: Always try to reserve GGTT address 0x0 +- drm/i915: Always flush the active worker before returning from the wait +- drm/nouveau/kms/gk104-gp1xx: Fix > 64x64 cursors +- Revert "drm/amdgpu/swsmu: drop set_fan_speed_percent (v2)" +- ASoC: AMD Renoir - refine DMI entries for some Lenovo products +- x86/xen: avoid warning in Xen pv guest with CONFIG_AMD_MEM_ENCRYPT enabled +- wext: fix NULL-ptr-dereference with cfg80211's lack of commit() +- ARM: dts: imx6qdl-gw52xx: fix duplicate regulator naming +- ARM: dts: ux500: Reserve memory carveouts +- ARM: dts: tbs2910: rename MMC node aliases +- media: rc: ensure that uevent can be read directly after rc device register +- media: rc: ite-cir: fix min_timeout calculation +- media: rc: fix timeout handling after switch to microsecond durations +- media: hantro: Fix reset_raw_fmt initialization +- media: cedrus: Fix H264 decoding +- media: cec: add stm32 driver +- parisc: Enable -mlong-calls gcc option by default when !CONFIG_MODULES +- ALSA: hda/via: Apply the workaround generically for Clevo machines +- ALSA: hda/realtek: Enable headset of ASUS B1400CEPE with ALC256 +- kernel: kexec: remove the lock operation of system_transition_mutex +- ACPI: thermal: Do not call acpi_thermal_check() directly +- ACPI: sysfs: Prefer "compatible" modalias +- tty: avoid using vfs_iocb_iter_write() for redirected console writes +- nbd: freeze the queue while we're adding connections +- iwlwifi: provide gso_type to GSO packets + +* Mon Feb 08 2021 Xie XiuQi - 5.10.0-3.0.0.12 +- kdump: update Documentation about crashkernel +- arm64: kdump: add memory for devices by DT property linux,usable-memory-range +- x86, arm64: Add ARCH_WANT_RESERVE_CRASH_KERNEL config +- arm64: kdump: reimplement crashkernel=X +- arm64: kdump: introduce some macroes for crash kernel reservation +- x86/elf: Move vmcore_elf_check_arch_cross to arch/x86/include/asm/elf.h +- x86: kdump: move reserve_crashkernel[_low]() into crash_core.c +- x86: kdump: move xen_pv_domain() check and insert_resource() to setup_arch() +- x86: kdump: use macro CRASH_ADDR_LOW_MAX in functions reserve_crashkernel() +- x86: kdump: make the lower bound of crash kernel reservation consistent +- x86: kdump: replace the hard-coded alignment with macro CRASH_ALIGN +- ARM: kdump: Add LPAE support +- ARM: kdump: fix timer interrupts panic, could not boot capture_kernel +- driver: input: fix UBSAN warning in input_defuzz_abs_event +- vdso: do cntvct workaround in the VDSO +- arm64: arch_timer: Disable CNTVCT_EL0 trap if workaround is enabled +- cgroup: Return ERSCH when add Z process into task +- ARM: 9027/1: head.S: explicitly map DT even if it lives in the first physical section +- ARM: 9028/1: disable KASAN in call stack capturing routines +- ARM: 9022/1: Change arch/arm/lib/mem*.S to use WEAK instead of .weak +- ARM: 9020/1: mm: use correct section size macro to describe the FDT virtual address +- ARM: 9017/2: Enable KASan for ARM +- ARM: 9016/2: Initialize the mapping of KASan shadow memory +- ARM: 9015/2: Define the virtual space of KASan's shadow region +- ARM: 9014/2: Replace string mem* functions for KASan +- ARM: 9013/2: Disable KASan instrumentation for some code +- ARM: 9012/1: move device tree mapping out of linear region +- ARM: 9011/1: centralize phys-to-virt conversion of DT/ATAGS address +- drm/radeon: check the alloc_workqueue return value +- printk: fix string termination for record_print_text() +- printk: fix buffer overflow potential for print_text() +- tools: Factor HOSTCC, HOSTLD, HOSTAR definitions +- mm: fix a race on nr_swap_pages +- mm/page_alloc: add a missing mm_page_alloc_zone_locked() tracepoint +- objtool: Don't fail on missing symbol table +- io_uring: fix sleeping under spin in __io_clean_op +- io_uring: dont kill fasync under completion_lock +- io_uring: fix skipping disabling sqo on exec +- io_uring: fix uring_flush in exit_files() warning +- io_uring: fix false positive sqo warning on flush +- io_uring: do sqo disable on install_fd error +- io_uring: fix null-deref in io_disable_sqo_submit +- io_uring: stop SQPOLL submit on creator's death +- io_uring: add warn_once for io_uring_flush() +- io_uring: inline io_uring_attempt_task_drop() +- kernel/io_uring: cancel io_uring before task works +- iwlwifi: dbg: Don't touch the tlv data +- RDMA/vmw_pvrdma: Fix network_hdr_type reported in WC +- media: v4l2-subdev.h: BIT() is not available in userspace +- media: Revert "media: videobuf2: Fix length check for single plane dmabuf queueing" +- HID: multitouch: Apply MT_QUIRK_CONFIDENCE quirk for multi-input devices +- HID: wacom: Correct NULL dereference on AES pen proximity +- futex: Handle faults correctly for PI futexes +- futex: Simplify fixup_pi_state_owner() +- futex: Use pi_state_update_owner() in put_pi_state() +- rtmutex: Remove unused argument from rt_mutex_proxy_unlock() +- futex: Provide and use pi_state_update_owner() +- futex: Replace pointless printk in fixup_owner() +- futex: Ensure the correct return value from futex_lock_pi() +- Revert "mm/slub: fix a memory leak in sysfs_slab_add()" +- gpio: mvebu: fix pwm .get_state period calculation +- PCI/AER: increments pci bus reference count in aer-inject process +- PCI: add a member in 'struct pci_bus' to record the original 'pci_ops' +- sched, rt: fix isolated CPUs leaving task_group indefinitely throttled +- cgroup: wait for cgroup destruction to complete when umount +- cgroup: check if cgroup root is alive in cgroupstats_show() +- mtd:avoid blktrans_open/release race and avoid insmod ftl.ko deadlock +- jffs2: move jffs2_init_inode_info() just after allocating inode +- jffs2: protect no-raw-node-ref check of inocache by erase_completion_lock +- jffs2: handle INO_STATE_CLEARING in jffs2_do_read_inode() +- jffs2: reset pino_nlink to 0 when inode creation failed +- jffs2: GC deadlock reading a page that is used in jffs2_write_begin() +- jffs2: make the overwritten xattr invisible after remount +- Revert "mm: fix initialization of struct page for holes in memory layout" +- mm: fix initialization of struct page for holes in memory layout +- Commit 9bb48c82aced ("tty: implement write_iter") converted the tty layer to use write_iter. +- fs/pipe: allow sendfile() to pipe again +- interconnect: imx8mq: Use icc_sync_state +- kernfs: wire up ->splice_read and ->splice_write +- kernfs: implement ->write_iter +- kernfs: implement ->read_iter +- bpf: Local storage helpers should check nullness of owner ptr passed +- drm/i915/hdcp: Get conn while content_type changed +- ASoC: SOF: Intel: hda: Avoid checking jack on system suspend +- tcp: Fix potential use-after-free due to double kfree() +- x86/sev-es: Handle string port IO to kernel memory properly +- net: systemport: free dev before on error path +- tty: fix up hung_up_tty_write() conversion +- tty: implement write_iter +- x86/sev: Fix nonistr violation +- pinctrl: qcom: Don't clear pending interrupts when enabling +- pinctrl: qcom: Properly clear "intr_ack_high" interrupts when unmasking +- pinctrl: qcom: No need to read-modify-write the interrupt status +- pinctrl: qcom: Allow SoCs to specify a GPIO function that's not 0 +- net: core: devlink: use right genl user_ptr when handling port param get/set +- net: mscc: ocelot: Fix multicast to the CPU port +- tcp: fix TCP_USER_TIMEOUT with zero window +- tcp: do not mess with cloned skbs in tcp_add_backlog() +- net: dsa: b53: fix an off by one in checking "vlan->vid" +- net: Disable NETIF_F_HW_TLS_RX when RXCSUM is disabled +- net: mscc: ocelot: allow offloading of bridge on top of LAG +- ipv6: set multicast flag on the multicast route +- net_sched: reject silly cell_log in qdisc_get_rtab() +- net_sched: avoid shift-out-of-bounds in tcindex_set_parms() +- ipv6: create multicast route with RTPROT_KERNEL +- udp: mask TOS bits in udp_v4_early_demux() +- net_sched: gen_estimator: support large ewma log +- tcp: fix TCP socket rehash stats mis-accounting +- kasan: fix incorrect arguments passing in kasan_add_zero_shadow +- kasan: fix unaligned address is unhandled in kasan_remove_zero_shadow +- skbuff: back tiny skbs with kmalloc() in __netdev_alloc_skb() too +- lightnvm: fix memory leak when submit fails +- cachefiles: Drop superfluous readpages aops NULL check +- nvme-pci: fix error unwind in nvme_map_data +- nvme-pci: refactor nvme_unmap_data +- sh_eth: Fix power down vs. is_opened flag ordering +- selftests/powerpc: Fix exit status of pkey tests +- net: dsa: mv88e6xxx: also read STU state in mv88e6250_g1_vtu_getnext +- octeontx2-af: Fix missing check bugs in rvu_cgx.c +- ASoC: SOF: Intel: fix page fault at probe if i915 init fails +- locking/lockdep: Cure noinstr fail +- sh: Remove unused HAVE_COPY_THREAD_TLS macro +- sh: dma: fix kconfig dependency for G2_DMA +- drm/i915/hdcp: Update CP property in update_pipe +- tools: gpio: fix %llu warning in gpio-watch.c +- tools: gpio: fix %llu warning in gpio-event-mon.c +- netfilter: rpfilter: mask ecn bits before fib lookup +- cls_flower: call nla_ok() before nla_next() +- x86/cpu/amd: Set __max_die_per_package on AMD +- x86/entry: Fix noinstr fail +- drm/i915: Only enable DFP 4:4:4->4:2:0 conversion when outputting YCbCr 4:4:4 +- drm/i915: s/intel_dp_sink_dpms/intel_dp_set_power/ +- driver core: Extend device_is_dependent() +- driver core: Fix device link device name collision +- drivers core: Free dma_range_map when driver probe failed +- xhci: tegra: Delay for disabling LFPS detector +- xhci: make sure TRB is fully written before giving it to the controller +- usb: cdns3: imx: fix can't create core device the second time issue +- usb: cdns3: imx: fix writing read-only memory issue +- usb: bdc: Make bdc pci driver depend on BROKEN +- usb: udc: core: Use lock when write to soft_connect +- USB: gadget: dummy-hcd: Fix errors in port-reset handling +- usb: gadget: aspeed: fix stop dma register setting. +- USB: ehci: fix an interrupt calltrace error +- ehci: fix EHCI host controller initialization sequence +- serial: mvebu-uart: fix tx lost characters at power off +- stm class: Fix module init return on allocation failure +- intel_th: pci: Add Alder Lake-P support +- io_uring: fix short read retries for non-reg files +- io_uring: fix SQPOLL IORING_OP_CLOSE cancelation state +- io_uring: iopoll requests should also wake task ->in_idle state +- mm: fix numa stats for thp migration +- mm: memcg: fix memcg file_dirty numa stat +- mm: memcg/slab: optimize objcg stock draining +- proc_sysctl: fix oops caused by incorrect command parameters +- x86/setup: don't remove E820_TYPE_RAM for pfn 0 +- x86/mmx: Use KFPU_387 for MMX string operations +- x86/topology: Make __max_die_per_package available unconditionally +- x86/fpu: Add kernel_fpu_begin_mask() to selectively initialize state +- irqchip/mips-cpu: Set IPI domain parent chip +- cifs: do not fail __smb_send_rqst if non-fatal signals are pending +- powerpc/64s: fix scv entry fallback flush vs interrupt +- counter:ti-eqep: remove floor +- iio: adc: ti_am335x_adc: remove omitted iio_kfifo_free() +- drivers: iio: temperature: Add delay after the addressed reset command in mlx90632.c +- iio: ad5504: Fix setting power-down state +- iio: common: st_sensors: fix possible infinite loop in st_sensors_irq_thread +- i2c: sprd: depend on COMMON_CLK to fix compile tests +- perf evlist: Fix id index for heterogeneous systems +- can: peak_usb: fix use after free bugs +- can: vxcan: vxcan_xmit: fix use after free bug +- can: dev: can_restart: fix use after free bug +- selftests: net: fib_tests: remove duplicate log test +- xsk: Clear pool even for inactive queues +- ALSA: hda: Balance runtime/system PM if direct-complete is disabled +- gpio: sifive: select IRQ_DOMAIN_HIERARCHY rather than depend on it +- platform/x86: hp-wmi: Don't log a warning on HPWMI_RET_UNKNOWN_COMMAND errors +- platform/x86: intel-vbtn: Drop HP Stream x360 Convertible PC 11 from allow-list +- drm/vc4: Unify PCM card's driver_name +- i2c: octeon: check correct size of maximum RECV_LEN packet +- iov_iter: fix the uaccess area in copy_compat_iovec_from_user +- printk: fix kmsg_dump_get_buffer length calulations +- printk: ringbuffer: fix line counting +- RDMA/cma: Fix error flow in default_roce_mode_store +- RDMA/umem: Avoid undefined behavior of rounddown_pow_of_two() +- drm/amdkfd: Fix out-of-bounds read in kdf_create_vcrat_image_cpu() +- bpf: Reject too big ctx_size_in for raw_tp test run +- arm64: entry: remove redundant IRQ flag tracing +- powerpc: Fix alignment bug within the init sections +- powerpc: Use the common INIT_DATA_SECTION macro in vmlinux.lds.S +- bpf: Prevent double bpf_prog_put call from bpf_tracing_prog_attach +- crypto: omap-sham - Fix link error without crypto-engine +- scsi: ufs: Fix tm request when non-fatal error happens +- scsi: ufs: ufshcd-pltfrm depends on HAS_IOMEM +- scsi: megaraid_sas: Fix MEGASAS_IOC_FIRMWARE regression +- btrfs: print the actual offset in btrfs_root_name +- RDMA/ucma: Do not miss ctx destruction steps in some cases +- pinctrl: mediatek: Fix fallback call path +- pinctrl: aspeed: g6: Fix PWMG0 pinctrl setting +- gpiolib: cdev: fix frame size warning in gpio_ioctl() +- nfsd: Don't set eof on a truncated READ_PLUS +- nfsd: Fixes for nfsd4_encode_read_plus_data() +- x86/xen: fix 'nopvspin' build error +- RISC-V: Fix maximum allowed phsyical memory for RV32 +- RISC-V: Set current memblock limit +- libperf tests: Fail when failing to get a tracepoint id +- libperf tests: If a test fails return non-zero +- io_uring: flush timeouts that should already have expired +- drm/nouveau/kms/nv50-: fix case where notifier buffer is at offset 0 +- drm/nouveau/mmu: fix vram heap sizing +- drm/nouveau/i2c/gm200: increase width of aux semaphore owner fields +- drm/nouveau/privring: ack interrupts the same way as RM +- drm/nouveau/bios: fix issue shadowing expansion ROMs +- drm/amd/display: Fix to be able to stop crc calculation +- HID: logitech-hidpp: Add product ID for MX Ergo in Bluetooth mode +- drm/amd/display: disable dcn10 pipe split by default +- drm/amdgpu/psp: fix psp gfx ctrl cmds +- riscv: defconfig: enable gpio support for HiFive Unleashed +- dts: phy: add GPIO number and active state used for phy reset +- dts: phy: fix missing mdio device and probe failure of vsc8541-01 device +- x86/xen: Fix xen_hvm_smp_init() when vector callback not available +- x86/xen: Add xen_no_vector_callback option to test PCI INTX delivery +- xen: Fix event channel callback via INTX/GSI +- arm64: make atomic helpers __always_inline +- riscv: cacheinfo: Fix using smp_processor_id() in preemptible +- ALSA: hda/tegra: fix tegra-hda on tegra30 soc +- clk: tegra30: Add hda clock default rates to clock driver +- HID: Ignore battery for Elan touchscreen on ASUS UX550 +- HID: logitech-dj: add the G602 receiver +- riscv: Enable interrupts during syscalls with M-Mode +- riscv: Fix sifive serial driver +- riscv: Fix kernel time_init() +- scsi: sd: Suppress spurious errors when WRITE SAME is being disabled +- scsi: scsi_debug: Fix memleak in scsi_debug_init() +- scsi: qedi: Correct max length of CHAP secret +- scsi: ufs: Correct the LUN used in eh_device_reset_handler() callback +- scsi: ufs: Relax the condition of UFSHCI_QUIRK_SKIP_MANUAL_WB_FLUSH_CTRL +- x86/hyperv: Fix kexec panic/hang issues +- dm integrity: select CRYPTO_SKCIPHER +- HID: sony: select CONFIG_CRC32 +- HID: multitouch: Enable multi-input for Synaptics pointstick/touchpad device +- SUNRPC: Handle TCP socket sends with kernel_sendpage() again +- ASoC: rt711: mutex between calibration and power state changes +- ASoC: Intel: haswell: Add missing pm_ops +- drm/i915: Check for rq->hwsp validity after acquiring RCU lock +- drm/i915/gt: Prevent use of engine->wa_ctx after error +- drm/amd/display: DCN2X Find Secondary Pipe properly in MPO + ODM Case +- drm/amdgpu: remove gpu info firmware of green sardine +- drm/syncobj: Fix use-after-free +- drm/atomic: put state on error path +- dm integrity: conditionally disable "recalculate" feature +- dm integrity: fix a crash if "recalculate" used without "internal_hash" +- dm: avoid filesystem lookup in dm_get_dev_t() +- mmc: sdhci-brcmstb: Fix mmc timeout errors on S5 suspend +- mmc: sdhci-xenon: fix 1.8v regulator stabilization +- mmc: sdhci-of-dwcmshc: fix rpmb access +- mmc: core: don't initialize block size from ext_csd if not present +- pinctrl: ingenic: Fix JZ4760 support +- fs: fix lazytime expiration handling in __writeback_single_inode() +- btrfs: send: fix invalid clone operations when cloning from the same file and root +- btrfs: don't clear ret in btrfs_start_dirty_block_groups +- btrfs: fix lockdep splat in btrfs_recover_relocation +- btrfs: do not double free backref nodes on error +- btrfs: don't get an EINTR during drop_snapshot for reloc +- ACPI: scan: Make acpi_bus_get_device() clear return pointer on error +- dm crypt: fix copy and paste bug in crypt_alloc_req_aead +- crypto: xor - Fix divide error in do_xor_speed() +- ALSA: hda/via: Add minimum mute flag +- ALSA: hda/realtek - Limit int mic boost on Acer Aspire E5-575T +- ALSA: seq: oss: Fix missing error check in snd_seq_oss_synth_make_info() +- platform/x86: ideapad-laptop: Disable touchpad_switch for ELAN0634 +- platform/x86: i2c-multi-instantiate: Don't create platform device for INT3515 ACPI nodes +- i2c: bpmp-tegra: Ignore unknown I2C_M flags +- i2c: tegra: Wait for config load atomically while in ISR +- mtd: rawnand: nandsim: Fix the logic when selecting Hamming soft ECC engine +- mtd: rawnand: gpmi: fix dst bit offset when extracting raw payload +- scsi: target: tcmu: Fix use-after-free of se_cmd->priv +- mtd: phram: use div_u64_rem to stop overwrite len in phram_setup +- mtd: phram: Allow the user to set the erase page size. + +* Mon Feb 01 2021 Xie XiuQi - 5.10.0-2.0.0.11 +- config: add initial openeuler_defconfig for x86 +- config: add initial openeuler_defconfig for arm64 +- spi: cadence: cache reference clock rate during probe +- spi: fsl: Fix driver breakage when SPI_CS_HIGH is not set in spi->mode +- cxgb4/chtls: Fix tid stuck due to wrong update of qid +- net: dsa: unbind all switches from tree when DSA master unbinds +- mac80211: check if atf has been disabled in __ieee80211_schedule_txq +- mac80211: do not drop tx nulldata packets on encrypted links +- drm/panel: otm8009a: allow using non-continuous dsi clock +- can: mcp251xfd: mcp251xfd_handle_rxif_one(): fix wrong NULL pointer check +- net: stmmac: use __napi_schedule() for PREEMPT_RT +- rxrpc: Fix handling of an unsupported token type in rxrpc_read() +- net: dsa: clear devlink port type before unregistering slave netdevs +- net: phy: smsc: fix clk error handling +- dt-bindings: net: renesas,etheravb: RZ/G2H needs tx-internal-delay-ps +- net: avoid 32 x truesize under-estimation for tiny skbs +- net: stmmac: fix taprio configuration when base_time is in the past +- net: stmmac: fix taprio schedule configuration +- net: sit: unregister_netdevice on newlink's error path +- net: stmmac: Fixed mtu channged by cache aligned +- i40e: fix potential NULL pointer dereferencing +- rxrpc: Call state should be read with READ_ONCE() under some circumstances +- net: dcb: Accept RTM_GETDCB messages carrying set-like DCB commands +- net: dcb: Validate netlink message in DCB handler +- esp: avoid unneeded kmap_atomic call +- rndis_host: set proper input size for OID_GEN_PHYSICAL_MEDIUM request +- net: mvpp2: Remove Pause and Asym_Pause support +- mlxsw: core: Increase critical threshold for ASIC thermal zone +- mlxsw: core: Add validation of transceiver temperature thresholds +- tipc: fix NULL deref in tipc_link_xmit() +- net: ipv6: Validate GSO SKB before finish IPv6 processing +- netxen_nic: fix MSI/MSI-x interrupts +- udp: Prevent reuseport_select_sock from reading uninitialized socks +- net: fix use-after-free when UDP GRO with shared fraglist +- net: ipa: modem: add missing SET_NETDEV_DEV() for proper sysfs links +- bpf: Fix helper bpf_map_peek_elem_proto pointing to wrong callback +- bpf: Support PTR_TO_MEM{,_OR_NULL} register spilling +- bpf: Don't leak memory in bpf getsockopt when optlen == 0 +- nfsd4: readdirplus shouldn't return parent of export +- X.509: Fix crash caused by NULL pointer +- bpf: Fix signed_{sub,add32}_overflows type handling +- drm/amdgpu/display: drop DCN support for aarch64 +- x86/hyperv: Initialize clockevents after LAPIC is initialized +- bpf: Fix selftest compilation on clang 11 +- Revert "kconfig: remove 'kvmconfig' and 'xenconfig' shorthands" +- kretprobe: check re-registration of the same kretprobe earlier +- perf tools: set the default length of HW_BREAKPOINT_X as 4 for non X86_64 +- ARM: LPAE: Use phys_addr_t instead of unsigned long in outercache hooks +- aio: add timeout validity check for io_[p]getevents +- ARM: kprobes: fix gcc-7 build warning +- proc: fix ubsan warning in mem_lseek +- netfilter: nf_nat: Fix memleak in nf_nat_init +- netfilter: conntrack: fix reading nf_conntrack_buckets +- ALSA: firewire-tascam: Fix integer overflow in midi_port_work() +- ALSA: fireface: Fix integer overflow in transmit_midi_msg() +- dm: eliminate potential source of excessive kernel log noise +- selftests: netfilter: Pass family parameter "-f" to conntrack tool +- net: sunrpc: interpret the return value of kstrtou32 correctly +- iommu/vt-d: Fix unaligned addresses for intel_flush_svm_range_dev() +- riscv: Trace irq on only interrupt is enabled +- mm, slub: consider rest of partial list if acquire_slab() fails +- drm/i915/gt: Restore clear-residual mitigations for Ivybridge, Baytrail +- drm/i915/icl: Fix initing the DSI DSC power refcount during HW readout +- drm/i915/dsi: Use unconditional msleep for the panel_on_delay when there is no reset-deassert MIPI-sequence +- dm zoned: select CONFIG_CRC32 +- umount(2): move the flag validity checks first +- IB/mlx5: Fix error unwinding when set_has_smi_cap fails +- RDMA/mlx5: Fix wrong free of blue flame register on error +- bnxt_en: Improve stats context resource accounting with RDMA driver loaded. +- RDMA/usnic: Fix memleak in find_free_vf_and_create_qp_grp +- RDMA/restrack: Don't treat as an error allocation ID wrapping +- ext4: fix superblock checksum failure when setting password salt +- scsi: ufs: Fix possible power drain during system suspend +- NFS: nfs_igrab_and_active must first reference the superblock +- NFS: nfs_delegation_find_inode_server must first reference the superblock +- NFS/pNFS: Fix a leak of the layout 'plh_outstanding' counter +- NFS/pNFS: Don't leak DS commits in pnfs_generic_retry_commit() +- NFS/pNFS: Don't call pnfs_free_bucket_lseg() before removing the request +- NFS: Adjust fs_context error logging +- pNFS: Stricter ordering of layoutget and layoutreturn +- pNFS: Mark layout for return if return-on-close was not sent +- pNFS: We want return-on-close to complete when evicting the inode +- NFS4: Fix use-after-free in trace_event_raw_event_nfs4_set_lock +- nvme-tcp: Fix warning with CONFIG_DEBUG_PREEMPT +- nvme-tcp: fix possible data corruption with bio merges +- nvme: don't intialize hwmon for discovery controllers +- nvmet-rdma: Fix NULL deref when setting pi_enable and traddr INADDR_ANY +- ASoC: Intel: fix error code cnl_set_dsp_D0() +- ASoC: meson: axg-tdmin: fix axg skew offset +- ASoC: meson: axg-tdm-interface: fix loopback +- dump_common_audit_data(): fix racy accesses to ->d_name +- perf intel-pt: Fix 'CPU too large' error +- mm: don't put pinned pages into the swap cache +- mm: don't play games with pinned pages in clear_page_refs +- mm: fix clear_refs_write locking +- blk-mq-debugfs: Add decode for BLK_MQ_F_TAG_HCTX_SHARED +- net/mlx5: E-Switch, fix changing vf VLANID +- net/mlx5: Fix passing zero to 'PTR_ERR' +- net/mlx5e: CT: Use per flow counter when CT flow accounting is enabled +- iommu/vt-d: Update domain geometry in iommu_ops.at(de)tach_dev +- nvme-fc: avoid calling _nvme_fc_abort_outstanding_ios from interrupt context +- cfg80211: select CONFIG_CRC32 +- x86/sev-es: Fix SEV-ES OUT/IN immediate opcode vc handling +- bpf: Save correct stopping point in file seq iteration +- bpf: Simplify task_file_seq_get_next() +- rcu-tasks: Move RCU-tasks initialization to before early_initcall() +- poll: fix performance regression due to out-of-line __put_user() +- ARM: picoxcell: fix missing interrupt-parent properties +- drm/msm: Call msm_init_vram before binding the gpu +- ACPI: scan: add stub acpi_create_platform_device() for !CONFIG_ACPI +- iommu/vt-d: Fix lockdep splat in sva bind()/unbind() +- usb: typec: Fix copy paste error for NVIDIA alt-mode description +- drm/amdgpu: fix potential memory leak during navi12 deinitialization +- drm/amd/pm: fix the failure when change power profile for renoir +- drm/amdgpu: fix a GPU hang issue when remove device +- drm/amd/display: fix sysfs amdgpu_current_backlight_pwm NULL pointer issue +- nvmet-rdma: Fix list_del corruption on queue establishment failure +- nvme: avoid possible double fetch in handling CQE +- nvme-pci: mark Samsung PM1725a as IGNORE_DEV_SUBNQN +- selftests: fix the return value for UDP GRO test +- net: ethernet: fs_enet: Add missing MODULE_LICENSE +- misdn: dsp: select CONFIG_BITREVERSE +- arch/arc: add copy_user_page() to to fix build error on ARC +- bfq: Fix computation of shallow depth +- io_uring: drop file refs after task cancel +- spi: fix the divide by 0 error when calculating xfer waiting time +- kconfig: remove 'kvmconfig' and 'xenconfig' shorthands +- lib/raid6: Let $(UNROLL) rules work with macOS userland +- hwmon: (pwm-fan) Ensure that calculation doesn't discard big period values +- habanalabs: Fix memleak in hl_device_reset +- spi: altera: fix return value for altera_spi_txrx() +- staging: spmi: hisi-spmi-controller: Fix some error handling paths +- habanalabs: register to pci shutdown callback +- habanalabs/gaudi: retry loading TPC f/w on -EINTR +- habanalabs: adjust pci controller init to new firmware +- ARM: dts: ux500/golden: Set display max brightness +- ethernet: ucc_geth: fix definition and size of ucc_geth_tx_global_pram +- regulator: bd718x7: Add enable times +- btrfs: fix transaction leak and crash after RO remount caused by qgroup rescan +- btrfs: merge critical sections of discard lock in workfn +- btrfs: fix async discard stall +- ath11k: qmi: try to allocate a big block of DMA memory first +- netfilter: ipset: fixes possible oops in mtype_resize +- ath11k: fix crash caused by NULL rx_channel +- ARM: omap2: pmic-cpcap: fix maximum voltage to be consistent with defaults on xt875 +- ARC: build: move symlink creation to arch/arc/Makefile to avoid race +- ARC: build: add boot_targets to PHONY +- ARC: build: add uImage.lzma to the top-level target +- ARC: build: remove non-existing bootpImage from KBUILD_IMAGE +- io_uring: drop mm and files after task_work_run +- io_uring: don't take files/mm for a dead task +- ext4: don't leak old mountpoint samples +- btrfs: tree-checker: check if chunk item end overflows +- r8152: Add Lenovo Powered USB-C Travel Hub +- stmmac: intel: change all EHL/TGL to auto detect phy addr +- dm crypt: defer decryption to a tasklet if interrupts disabled +- dm crypt: do not call bio_endio() from the dm-crypt tasklet +- dm crypt: do not wait for backlogged crypto request completion in softirq +- dm crypt: use GFP_ATOMIC when allocating crypto requests from softirq +- dm integrity: fix the maximum number of arguments +- dm integrity: fix flush with external metadata device +- dm snapshot: flush merged data before committing metadata +- dm raid: fix discard limits for raid1 +- mm/process_vm_access.c: include compat.h +- mm/hugetlb: fix potential missing huge page size info +- mm/vmalloc.c: fix potential memory leak +- compiler.h: Raise minimum version of GCC to 5.1 for arm64 +- xen/privcmd: allow fetching resource sizes +- ACPI: scan: Harden acpi_device_add() against device ID overflows +- RDMA/ocrdma: Fix use after free in ocrdma_dealloc_ucontext_pd() +- MIPS: relocatable: fix possible boot hangup with KASLR enabled +- MIPS: Fix malformed NT_FILE and NT_SIGINFO in 32bit coredumps +- MIPS: boot: Fix unaligned access with CONFIG_MIPS_RAW_APPENDED_DTB +- mips: lib: uncached: fix non-standard usage of variable 'sp' +- mips: fix Section mismatch in reference +- riscv: Fix KASAN memory mapping. +- riscv: Fixup CONFIG_GENERIC_TIME_VSYSCALL +- riscv: return -ENOSYS for syscall -1 +- riscv: Drop a duplicated PAGE_KERNEL_EXEC +- cifs: fix interrupted close commands +- cifs: check pointer before freeing +- ext4: fix wrong list_splice in ext4_fc_cleanup +- ext4: use IS_ERR instead of IS_ERR_OR_NULL and set inode null when IS_ERR +- tools/bootconfig: Add tracing_on support to helper scripts +- tracing/kprobes: Do the notrace functions check without kprobes on ftrace +- drm/bridge: sii902x: Enable I/O and core VCC supplies if present +- dt-bindings: display: sii902x: Add supply bindings +- drm/bridge: sii902x: Refactor init code into separate function +- drm/i915/backlight: fix CPU mode backlight takeover on LPT +- drm/i915/gt: Limit VFE threads based on GT +- drm/i915: Allow the sysadmin to override security mitigations +- drm/amdgpu: add new device id for Renior +- Revert "drm/amd/display: Fixed Intermittent blue screen on OLED panel" +- drm/amdgpu: fix DRM_INFO flood if display core is not supported (bug 210921) +- drm/amdgpu: add green_sardine device id (v2) +- x86/hyperv: check cpu mask after interrupt has been disabled +- ASoC: dapm: remove widget from dirty list on free +- ASoC: AMD Renoir - add DMI entry for Lenovo ThinkPad X395 +- ALSA: doc: Fix reference to mixart.rst +- ALSA: hda/realtek: fix right sounds and mute/micmute LEDs for HP machines +- btrfs: prevent NULL pointer dereference in extent_io_tree_panic +- btrfs: reloc: fix wrong file extent type check to avoid false ENOENT +- sched/rt.c: pick and check task if double_lock_balance() unlock the rq +- sched/deadline.c: pick and check task if double_lock_balance() unlock the rq +- tools headers UAPI: Sync linux/fscrypt.h with the kernel sources +- drm/panfrost: Remove unused variables in panfrost_job_close() +- regmap: debugfs: Fix a reversed if statement in regmap_debugfs_init() +- net: drop bogus skb with CHECKSUM_PARTIAL and offset beyond end of trimmed packet +- block: fix use-after-free in disk_part_iter_next +- can: isotp: isotp_getname(): fix kernel information leak +- block/rnbd-clt: avoid module unload race with close confirmation +- xsk: Rollback reservation at NETDEV_TX_BUSY +- xsk: Fix race in SKB mode transmit with shared cq +- KVM: arm64: Don't access PMCR_EL0 when no PMU is available +- selftests: fib_nexthops: Fix wrong mausezahn invocation +- net: mvneta: fix error message when MTU too large for XDP +- drm/i915/dp: Track pm_qos per connector +- net: mvpp2: disable force link UP during port init procedure +- regulator: qcom-rpmh-regulator: correct hfsmps515 definition +- arm64: cpufeature: remove non-exist CONFIG_KVM_ARM_HOST +- wan: ds26522: select CONFIG_BITREVERSE +- regmap: debugfs: Fix a memory leak when calling regmap_attach_dev +- net/mlx5e: Fix two double free cases +- net/mlx5e: Fix memleak in mlx5e_create_l2_table_groups +- nvme-tcp: Fix possible race of io_work and direct send +- bpftool: Fix compilation failure for net.o with older glibc +- iommu/intel: Fix memleak in intel_irq_remapping_alloc +- iommu/vt-d: Fix misuse of ALIGN in qi_flush_piotlb() +- zonefs: select CONFIG_CRC32 +- lightnvm: select CONFIG_CRC32 +- block: rsxx: select CONFIG_CRC32 +- wil6210: select CONFIG_CRC32 +- phy: dp83640: select CONFIG_CRC32 +- qed: select CONFIG_CRC32 +- arm64: mm: Fix ARCH_LOW_ADDRESS_LIMIT when !CONFIG_ZONE_DMA +- dmaengine: xilinx_dma: fix mixed_enum_type coverity warning +- dmaengine: xilinx_dma: fix incompatible param warning in _child_probe() +- dmaengine: xilinx_dma: check dma_async_device_register return value +- dmaengine: milbeaut-xdmac: Fix a resource leak in the error handling path of the probe function +- dmaengine: mediatek: mtk-hsdma: Fix a resource leak in the error handling path of the probe function +- interconnect: qcom: fix rpmh link failures +- interconnect: imx: Add a missing of_node_put after of_device_is_available +- bcache: set bcache device into read-only mode for BCH_FEATURE_INCOMPAT_OBSO_LARGE_BUCKET +- i2c: mediatek: Fix apdma and i2c hand-shake timeout +- i2c: i801: Fix the i2c-mux gpiod_lookup_table not being properly terminated +- spi: stm32: FIFO threshold level - fix align packet size +- spi: spi-geni-qcom: Fix geni_spi_isr() NULL dereference in timeout case +- cpufreq: powernow-k8: pass policy rather than use cpufreq_cpu_get() +- spi: spi-geni-qcom: Fail new xfers if xfer/cancel/abort pending +- can: kvaser_pciefd: select CONFIG_CRC32 +- can: m_can: m_can_class_unregister(): remove erroneous m_can_clk_stop() +- can: tcan4x5x: fix bittiming const, use common bittiming from m_can driver +- selftests/bpf: Clarify build error if no vmlinux +- dmaengine: dw-edma: Fix use after free in dw_edma_alloc_chunk() +- i2c: sprd: use a specific timeout to avoid system hang up issue +- ARM: OMAP2+: omap_device: fix idling of devices during probe +- fanotify: Fix sys_fanotify_mark() on native x86-32 +- HID: wacom: Fix memory leakage caused by kfifo_alloc +- ionic: start queues before announcing link up +- scsi: lpfc: Fix variable 'vport' set but not used in lpfc_sli4_abts_err_handler() +- net/mlx5: Check if lag is supported before creating one +- net/mlx5e: In skb build skip setting mark in switchdev mode +- net/mlx5e: ethtool, Fix restriction of autoneg with 56G +- net/mlx5: Use port_num 1 instead of 0 when delete a RoCE address +- net: dsa: lantiq_gswip: Exclude RMII from modes that report 1 GbE +- s390/qeth: fix L2 header access in qeth_l3_osa_features_check() +- s390/qeth: fix locking for discipline setup / removal +- s390/qeth: fix deadlock during recovery +- nexthop: Bounce NHA_GATEWAY in FDB nexthop groups +- nexthop: Unlink nexthop group entry in error path +- nexthop: Fix off-by-one error in error path +- octeontx2-af: fix memory leak of lmac and lmac->name +- chtls: Fix chtls resources release sequence +- chtls: Added a check to avoid NULL pointer dereference +- chtls: Replace skb_dequeue with skb_peek +- chtls: Avoid unnecessary freeing of oreq pointer +- chtls: Fix panic when route to peer not configured +- chtls: Remove invalid set_tcb call +- chtls: Fix hardware tid leak +- net: ip: always refragment ip defragmented packets +- net: fix pmtu check in nopmtudisc mode +- tools: selftests: add test for changing routes with PTMU exceptions +- net: ipv6: fib: flush exceptions when purging route +- ptp: ptp_ines: prevent build when HAS_IOMEM is not set +- net: bareudp: add missing error handling for bareudp_link_config() +- net/sonic: Fix some resource leaks in error handling paths +- net: vlan: avoid leaks on register_vlan_dev() failures +- net: stmmac: dwmac-sun8i: Balance syscon (de)initialization +- net: stmmac: dwmac-sun8i: Balance internal PHY power +- net: stmmac: dwmac-sun8i: Balance internal PHY resource references +- net: stmmac: dwmac-sun8i: Fix probe error handling +- net: hns3: fix a phy loopback fail issue +- net: hns3: fix the number of queues actually used by ARQ +- net: hns3: fix incorrect handling of sctp6 rss tuple +- net: cdc_ncm: correct overhead in delayed_ndp_size +- btrfs: shrink delalloc pages instead of full inodes +- btrfs: fix deadlock when cloning inline extent and low on free metadata space +- btrfs: skip unnecessary searches for xattrs when logging an inode +- scsi: ufs: Fix -Wsometimes-uninitialized warning +- io_uring: Fix return value from alloc_fixed_file_ref_node +- drm/panfrost: Don't corrupt the queue mutex on open/close +- iommu/arm-smmu-qcom: Initialize SCTLR of the bypass context +- RDMA/hns: Avoid filling sl in high 3 bits of vlan_id +- io_uring: patch up IOPOLL overflow_flush sync +- io_uring: limit {io|sq}poll submit locking scope +- io_uring: synchronise IOPOLL on task_submit fail +- powerpc/32s: Fix RTAS machine check with VMAP stack +- ARM: 9031/1: hyp-stub: remove unused .L__boot_cpu_mode_offset symbol +- ARM: kvm: replace open coded VA->PA calculations with adr_l call +- ARM: head.S: use PC relative insn sequence to calculate PHYS_OFFSET +- ARM: sleep.S: use PC-relative insn sequence for sleep_save_sp/mpidr_hash +- ARM: head: use PC-relative insn sequence for __smp_alt +- ARM: kernel: use relative references for UP/SMP alternatives +- ARM: head.S: use PC-relative insn sequence for secondary_data +- ARM: head-common.S: use PC-relative insn sequence for idmap creation +- ARM: head-common.S: use PC-relative insn sequence for __proc_info +- ARM: efistub: replace adrl pseudo-op with adr_l macro invocation +- ARM: p2v: reduce p2v alignment requirement to 2 MiB +- ARM: p2v: switch to MOVW for Thumb2 and ARM/LPAE +- ARM: p2v: simplify __fixup_pv_table() +- ARM: p2v: use relative references in patch site arrays +- ARM: p2v: drop redundant 'type' argument from __pv_stub +- ARM: p2v: factor out BE8 handling +- ARM: p2v: factor out shared loop processing +- ARM: p2v: move patching code to separate assembler source file +- ARM: module: add support for place relative relocations +- ARM: assembler: introduce adr_l, ldr_l and str_l macros +- scsi: target: Fix XCOPY NAA identifier lookup +- rtlwifi: rise completion at the last step of firmware callback +- xsk: Fix memory leak for failed bind +- KVM: x86: fix shift out of bounds reported by UBSAN +- x86/mtrr: Correct the range check before performing MTRR type lookups +- dmaengine: idxd: off by one in cleanup code +- netfilter: nft_dynset: report EOPNOTSUPP on missing set feature +- netfilter: xt_RATEEST: reject non-null terminated string from userspace +- netfilter: ipset: fix shift-out-of-bounds in htable_bits() +- netfilter: x_tables: Update remaining dereference to RCU +- ARM: dts: OMAP3: disable AES on N950/N9 +- net/mlx5e: Fix SWP offsets when vlan inserted by driver +- bcache: introduce BCH_FEATURE_INCOMPAT_LOG_LARGE_BUCKET_SIZE for large bucket +- bcache: check unsupported feature sets for bcache register +- bcache: fix typo from SUUP to SUPP in features.h +- drm/i915: clear the gpu reloc batch +- drm/i915: clear the shadow batch +- arm64: link with -z norelro for LLD or aarch64-elf +- dmabuf: fix use-after-free of dmabuf's file->f_inode +- Revert "device property: Keep secondary firmware node secondary by type" +- btrfs: send: fix wrong file path when there is an inode with a pending rmdir +- btrfs: qgroup: don't try to wait flushing if we're already holding a transaction +- iommu/vt-d: Move intel_iommu info from struct intel_svm to struct intel_svm_dev +- ALSA: hda/realtek: Add two "Intel Reference board" SSID in the ALC256. +- ALSA: hda/realtek: Enable mute and micmute LED on HP EliteBook 850 G7 +- ALSA: hda/realtek: Add mute LED quirk for more HP laptops +- ALSA: hda/realtek - Fix speaker volume control on Lenovo C940 +- ALSA: hda/conexant: add a new hda codec CX11970 +- ALSA: hda/via: Fix runtime PM for Clevo W35xSS +- blk-iocost: fix NULL iocg deref from racing against initialization +- x86/resctrl: Don't move a task to the same resource group +- x86/resctrl: Use an IPI instead of task_work_add() to update PQR_ASSOC MSR +- KVM: x86/mmu: Ensure TDP MMU roots are freed after yield +- kvm: check tlbs_dirty directly +- KVM: x86/mmu: Get root level from walkers when retrieving MMIO SPTE +- KVM: x86/mmu: Use -1 to flag an undefined spte in get_mmio_spte() +- x86/mm: Fix leak of pmd ptlock +- mm: make wait_on_page_writeback() wait for multiple pending writebacks +- hwmon: (amd_energy) fix allocation of hwmon_channel_info config +- USB: serial: keyspan_pda: remove unused variable +- usb: gadget: configfs: Fix use-after-free issue with udc_name +- usb: gadget: configfs: Preserve function ordering after bind failure +- usb: gadget: Fix spinlock lockup on usb_function_deactivate +- USB: gadget: legacy: fix return error code in acm_ms_bind() +- usb: gadget: u_ether: Fix MTU size mismatch with RX packet size +- usb: gadget: function: printer: Fix a memory leak for interface descriptor +- usb: gadget: f_uac2: reset wMaxPacketSize +- USB: Gadget: dummy-hcd: Fix shift-out-of-bounds bug +- usb: gadget: select CONFIG_CRC32 +- ALSA: usb-audio: Fix UBSAN warnings for MIDI jacks +- USB: usblp: fix DMA to stack +- USB: yurex: fix control-URB timeout handling +- USB: serial: option: add Quectel EM160R-GL +- USB: serial: option: add LongSung M5710 module support +- USB: serial: iuu_phoenix: fix DMA from stack +- usb: uas: Add PNY USB Portable SSD to unusual_uas +- usb: usbip: vhci_hcd: protect shift size +- USB: xhci: fix U1/U2 handling for hardware with XHCI_INTEL_HOST quirk set +- usb: chipidea: ci_hdrc_imx: add missing put_device() call in usbmisc_get_init_data() +- usb: dwc3: ulpi: Fix USB2.0 HS/FS/LS PHY suspend regression +- usb: dwc3: ulpi: Replace CPU-based busyloop with Protocol-based one +- usb: dwc3: ulpi: Use VStsDone to detect PHY regs access completion +- usb: dwc3: gadget: Clear wait flag on dequeue +- usb: dwc3: gadget: Restart DWC3 gadget when enabling pullup +- usb: dwc3: meson-g12a: disable clk on error handling path in probe +- usb: typec: intel_pmc_mux: Configure HPD first for HPD+IRQ request +- USB: cdc-wdm: Fix use after free in service_outstanding_interrupt(). +- USB: cdc-acm: blacklist another IR Droid device +- usb: gadget: enable super speed plus +- staging: mt7621-dma: Fix a resource leak in an error handling path +- Staging: comedi: Return -EFAULT if copy_to_user() fails +- powerpc: Handle .text.{hot,unlikely}.* in linker script +- crypto: asym_tpm: correct zero out potential secrets +- crypto: ecdh - avoid buffer overflow in ecdh_set_secret() +- scsi: block: Do not accept any requests while suspended +- scsi: block: Remove RQF_PREEMPT and BLK_MQ_REQ_PREEMPT +- Bluetooth: revert: hci_h5: close serdev device and free hu in h5_close +- kbuild: don't hardcode depmod path +- scsi: ufs: Clear UAC for FFU and RPMB LUNs +- depmod: handle the case of /sbin/depmod without /sbin in PATH +- lib/genalloc: fix the overflow when size is too big +- local64.h: make mandatory +- scsi: core: Only process PM requests if rpm_status != RPM_ACTIVE +- scsi: scsi_transport_spi: Set RQF_PM for domain validation commands +- scsi: ide: Mark power management requests with RQF_PM instead of RQF_PREEMPT +- scsi: ide: Do not set the RQF_PREEMPT flag for sense requests +- scsi: block: Introduce BLK_MQ_REQ_PM +- scsi: ufs-pci: Enable UFSHCD_CAP_RPM_AUTOSUSPEND for Intel controllers +- scsi: ufs-pci: Fix recovery from hibernate exit errors for Intel controllers +- scsi: ufs-pci: Ensure UFS device is in PowerDown mode for suspend-to-disk ->poweroff() +- scsi: ufs-pci: Fix restore from S4 for Intel controllers +- scsi: ufs: Fix wrong print message in dev_err() +- workqueue: Kick a worker based on the actual activation of delayed works +- block: add debugfs stanza for QUEUE_FLAG_NOWAIT +- selftests/vm: fix building protection keys test +- stmmac: intel: Add PCI IDs for TGL-H platform +- selftests: mlxsw: Set headroom size of correct port +- net: usb: qmi_wwan: add Quectel EM160R-GL +- ibmvnic: fix: NULL pointer dereference. +- CDC-NCM: remove "connected" log message +- net: dsa: lantiq_gswip: Fix GSWIP_MII_CFG(p) register access +- net: dsa: lantiq_gswip: Enable GSWIP_MII_CFG_EN also for internal PHYs +- r8169: work around power-saving bug on some chip versions +- vhost_net: fix ubuf refcount incorrectly when sendmsg fails +- bareudp: Fix use of incorrect min_headroom size +- bareudp: set NETIF_F_LLTX flag +- net: hdlc_ppp: Fix issues when mod_timer is called while timer is running +- erspan: fix version 1 check in gre_parse_header() +- net: hns: fix return value check in __lb_other_process() +- net: sched: prevent invalid Scell_log shift count +- ipv4: Ignore ECN bits for fib lookups in fib_compute_spec_dst() +- bnxt_en: Fix AER recovery. +- net: mvpp2: fix pkt coalescing int-threshold configuration +- bnxt_en: Check TQM rings for maximum supported value. +- e1000e: Export S0ix flags to ethtool +- Revert "e1000e: disable s0ix entry and exit flows for ME systems" +- e1000e: bump up timeout to wait when ME un-configures ULP mode +- e1000e: Only run S0ix flows if shutdown succeeded +- tun: fix return value when the number of iovs exceeds MAX_SKB_FRAGS +- net: ethernet: ti: cpts: fix ethtool output when no ptp_clock registered +- net-sysfs: take the rtnl lock when accessing xps_rxqs_map and num_tc +- net-sysfs: take the rtnl lock when storing xps_rxqs +- net-sysfs: take the rtnl lock when accessing xps_cpus_map and num_tc +- net-sysfs: take the rtnl lock when storing xps_cpus +- net: ethernet: Fix memleak in ethoc_probe +- net/ncsi: Use real net-device for response handler +- virtio_net: Fix recursive call to cpus_read_lock() +- qede: fix offload for IPIP tunnel packets +- net: ethernet: mvneta: Fix error handling in mvneta_probe +- ibmvnic: continue fatal error reset after passive init +- ibmvnic: fix login buffer memory leak +- net: stmmac: dwmac-meson8b: ignore the second clock input +- net: mvpp2: Fix GoP port 3 Networking Complex Control configurations +- atm: idt77252: call pci_disable_device() on error path +- ionic: account for vlan tag len in rx buffer len +- ethernet: ucc_geth: set dev->max_mtu to 1518 +- ethernet: ucc_geth: fix use-after-free in ucc_geth_remove() +- net: systemport: set dev->max_mtu to UMAC_MAX_MTU_SIZE +- net: mvpp2: prs: fix PPPoE with ipv6 packet parse +- net: mvpp2: Add TCAM entry to drop flow control pause frames +- net/sched: sch_taprio: ensure to reset/destroy all child qdiscs +- iavf: fix double-release of rtnl_lock +- i40e: Fix Error I40E_AQ_RC_EINVAL when removing VFs +- mwifiex: Fix possible buffer overflows in mwifiex_cmd_802_11_ad_hoc_start +- exec: Transform exec_update_mutex into a rw_semaphore +- rwsem: Implement down_read_interruptible +- rwsem: Implement down_read_killable_nested +- perf: Break deadlock involving exec_update_mutex +- fuse: fix bad inode +- RDMA/siw,rxe: Make emulated devices virtual in the device tree +- RDMA/core: remove use of dma_virt_ops +- scsi: ufs: Re-enable WriteBooster after device reset +- scsi: ufs: Allow an error return value from ->device_reset() +- drm/i915/tgl: Fix Combo PHY DPLL fractional divider for 38.4MHz ref clock +- ALSA: hda/hdmi: Fix incorrect mutex unlock in silent_stream_disable() +- ALSA: hda/realtek - Modify Dell platform name +- Bluetooth: Fix attempting to set RPA timeout when unsupported +- kdev_t: always inline major/minor helper functions +- dt-bindings: rtc: add reset-source property +- rtc: pcf2127: only use watchdog when explicitly available +- rtc: pcf2127: move watchdog initialisation to a separate function +- Revert "mtd: spinand: Fix OOB read" +- Revert "drm/amd/display: Fix memory leaks in S3 resume" +- ext4: fix bug for rename with RENAME_WHITEOUT +- device-dax: Fix range release +- ext4: avoid s_mb_prefetch to be zero in individual scenarios +- dm verity: skip verity work if I/O error when system is shutting down +- ALSA: pcm: Clear the full allocated memory at hw_params +- io_uring: remove racy overflow list fast checks +- s390: always clear kernel stack backchain before calling functions +- tick/sched: Remove bogus boot "safety" check +- drm/amd/display: updated wm table for Renoir +- ceph: fix inode refcount leak when ceph_fill_inode on non-I_NEW inode fails +- NFSv4.2: Don't error when exiting early on a READ_PLUS buffer overflow +- um: ubd: Submit all data segments atomically +- um: random: Register random as hwrng-core device +- watchdog: rti-wdt: fix reference leak in rti_wdt_probe +- fs/namespace.c: WARN if mnt_count has become negative +- powerpc/64: irq replay remove decrementer overflow check +- module: delay kobject uevent until after module init call +- f2fs: fix race of pending_pages in decompression +- f2fs: avoid race condition for shrinker count +- NFSv4: Fix a pNFS layout related use-after-free race when freeing the inode +- i3c master: fix missing destroy_workqueue() on error in i3c_master_register +- powerpc: sysdev: add missing iounmap() on error in mpic_msgr_probe() +- rtc: pl031: fix resource leak in pl031_probe +- quota: Don't overflow quota file offsets +- module: set MODULE_STATE_GOING state when a module fails to load +- rtc: sun6i: Fix memleak in sun6i_rtc_clk_init +- io_uring: check kthread stopped flag when sq thread is unparked +- fcntl: Fix potential deadlock in send_sig{io, urg}() +- ext4: check for invalid block size early when mounting a file system +- bfs: don't use WARNING: string when it's just info. +- ALSA: rawmidi: Access runtime->avail always in spinlock +- ALSA: seq: Use bool for snd_seq_queue internal flags +- f2fs: fix shift-out-of-bounds in sanity_check_raw_super() +- media: gp8psk: initialize stats at power control logic +- misc: vmw_vmci: fix kernel info-leak by initializing dbells in vmci_ctx_get_chkpt_doorbells() +- reiserfs: add check for an invalid ih_entry_count +- fbcon: Disable accelerated scrolling +- Bluetooth: hci_h5: close serdev device and free hu in h5_close +- scsi: cxgb4i: Fix TLS dependency +- zlib: move EXPORT_SYMBOL() and MODULE_LICENSE() out of dfltcc_syms.c +- cgroup: Fix memory leak when parsing multiple source parameters +- tools headers UAPI: Sync linux/const.h with the kernel headers +- uapi: move constants from to +- io_uring: fix io_sqe_files_unregister() hangs +- io_uring: add a helper for setting a ref node +- io_uring: use bottom half safe lock for fixed file data +- io_uring: don't assume mm is constant across submits +- lib/zlib: fix inflating zlib streams on s390 +- mm: memmap defer init doesn't work as expected +- mm/hugetlb: fix deadlock in hugetlb_cow error path +- scsi: block: Fix a race in the runtime power management code +- opp: Call the missing clk_put() on error +- opp: fix memory leak in _allocate_opp_table +- spi: dw-bt1: Fix undefined devm_mux_control_get symbol +- jffs2: Fix NULL pointer dereference in rp_size fs option parsing +- jffs2: Allow setting rp_size to zero during remounting +- io_uring: close a small race gap for files cancel +- drm/amd/display: Add get_dig_frontend implementation for DCEx +- md/raid10: initialize r10_bio->read_slot before use. +- ethtool: fix string set id check +- ethtool: fix error paths in ethnl_set_channels() +- mptcp: fix security context on server socket +- net/sched: sch_taprio: reset child qdiscs before freeing them + +* Tue Jan 29 2021 Yuan Zhichang - 5.10.0-1.0.0.10 +- Add the option of "with_perf" +- Output jvmti plug-in as part of perf building + +* Tue Jan 26 2021 Chunsheng Luo - 5.10.0-1.0.0.9 +- split from kernel-devel to kernel-headers and kernel-devel + +* Tue Jan 12 2021 Xie XiuQi - 5.10.0-1.0.0.8 +- kvm: debugfs: Export x86 kvm exits to vcpu_stat +- kvm: debugfs: aarch64 export cpu time related items to debugfs +- kvm: debugfs: export remaining aarch64 kvm exit reasons to debugfs +- kvm: debugfs: Export vcpu stat via debugfs +- RISCV: KVM: fix bug in migration +- RISC-V: Enable KVM for RV64 and RV32 +- RISC-V: KVM: Add MAINTAINERS entry +- RISC-V: KVM: Document RISC-V specific parts of KVM API +- RISC-V: KVM: Add SBI v0.1 support +- RISC-V: KVM: Implement ONE REG interface for FP registers +- RISC-V: KVM: FP lazy save/restore +- RISC-V: KVM: Add timer functionality +- RISC-V: KVM: Implement MMU notifiers +- RISC-V: KVM: Implement stage2 page table programming +- RISC-V: KVM: Implement VMID allocator +- RISC-V: KVM: Handle WFI exits for VCPU +- RISC-V: KVM: Handle MMIO exits for VCPU +- RISC-V: KVM: Implement VCPU world-switch +- RISC-V: KVM: Implement KVM_GET_ONE_REG/KVM_SET_ONE_REG ioctls +- RISC-V: KVM: Implement VCPU interrupts and requests handling +- RISC-V: KVM: Implement VCPU create, init and destroy functions +- RISC-V: Add initial skeletal KVM support +- RISC-V: Add hypervisor extension related CSR defines +- RISC-V: Enable drivers for Microchip PolarFire ICICLE board +- RISC-V: Initial DTS for Microchip ICICLE board +- RISC-V: Add Microchip PolarFire kconfig option +- Microchip Polarfire SoC Clock Driver +- RISC-V: Enable CPU Hotplug in defconfigs +- Revert "riscv: Use latest system call ABI" +- RISC-V: Add fragmented config for debug options +- x86/CPU/AMD: Save AMD NodeId as cpu_die_id +- drm/edid: fix objtool warning in drm_cvt_modes() +- null_blk: Fail zone append to conventional zones +- null_blk: Fix zone size initialization +- Revert: "ring-buffer: Remove HAVE_64BIT_ALIGNED_ACCESS" +- rtc: ep93xx: Fix NULL pointer dereference in ep93xx_rtc_read_time +- thermal/drivers/cpufreq_cooling: Update cpufreq_state only if state has changed +- remoteproc: sysmon: Ensure remote notification ordering +- regulator: axp20x: Fix DLDO2 voltage control register mask for AXP22x +- PCI: Fix pci_slot_release() NULL pointer dereference +- of: fix linker-section match-table corruption +- mt76: add back the SUPPORTS_REORDERING_BUFFER flag +- tracing: Disable ftrace selftests when any tracer is running +- platform/x86: intel-vbtn: Allow switch events on Acer Switch Alpha 12 +- libnvdimm/namespace: Fix reaping of invalidated block-window-namespace labels +- memory: renesas-rpc-if: Fix unbalanced pm_runtime_enable in rpcif_{enable,disable}_rpm +- memory: renesas-rpc-if: Return correct value to the caller of rpcif_manual_xfer() +- memory: renesas-rpc-if: Fix a node reference leak in rpcif_probe() +- memory: jz4780_nemc: Fix an error pointer vs NULL check in probe() +- xenbus/xenbus_backend: Disallow pending watch messages +- xen/xenbus: Count pending messages for each watch +- xen/xenbus/xen_bus_type: Support will_handle watch callback +- xen/xenbus: Add 'will_handle' callback support in xenbus_watch_path() +- xen/xenbus: Allow watches discard events before queueing +- xen-blkback: set ring->xenblkd to NULL after kthread_stop() +- driver: core: Fix list corruption after device_del() +- dma-buf/dma-resv: Respect num_fences when initializing the shared fence list. +- device-dax/core: Fix memory leak when rmmod dax.ko +- counter: microchip-tcb-capture: Fix CMR value check +- clk: tegra: Do not return 0 on failure +- clk: mvebu: a3700: fix the XTAL MODE pin to MPP1_9 +- clk: ingenic: Fix divider calculation with div tables +- pinctrl: sunxi: Always call chained_irq_{enter, exit} in sunxi_pinctrl_irq_handler +- md/cluster: fix deadlock when node is doing resync job +- md/cluster: block reshape with remote resync job +- iio:adc:ti-ads124s08: Fix alignment and data leak issues. +- iio:adc:ti-ads124s08: Fix buffer being too long. +- iio:imu:bmi160: Fix alignment and data leak issues +- iio:imu:bmi160: Fix too large a buffer. +- iio:pressure:mpl3115: Force alignment of buffer +- iio:magnetometer:mag3110: Fix alignment and data leak issues. +- iio:light:st_uvis25: Fix timestamp alignment and prevent data leak. +- iio:light:rpr0521: Fix timestamp alignment and prevent data leak. +- iio: imu: st_lsm6dsx: fix edge-trigger interrupts +- iio: adc: rockchip_saradc: fix missing clk_disable_unprepare() on error in rockchip_saradc_resume +- iio: buffer: Fix demux update +- openat2: reject RESOLVE_BENEATH|RESOLVE_IN_ROOT +- scsi: lpfc: Re-fix use after free in lpfc_rq_buf_free() +- scsi: lpfc: Fix scheduling call while in softirq context in lpfc_unreg_rpi +- scsi: lpfc: Fix invalid sleeping context in lpfc_sli4_nvmet_alloc() +- scsi: qla2xxx: Fix crash during driver load on big endian machines +- mtd: rawnand: meson: fix meson_nfc_dma_buffer_release() arguments +- mtd: rawnand: qcom: Fix DMA sync on FLASH_STATUS register read +- mtd: core: Fix refcounting for unpartitioned MTDs +- mtd: parser: cmdline: Fix parsing of part-names with colons +- mtd: spinand: Fix OOB read +- soc: qcom: smp2p: Safely acquire spinlock without IRQs +- spi: atmel-quadspi: Fix AHB memory accesses +- spi: atmel-quadspi: Disable clock in probe error path +- spi: mt7621: Don't leak SPI master in probe error path +- spi: mt7621: Disable clock in probe error path +- spi: synquacer: Disable clock in probe error path +- spi: st-ssc4: Fix unbalanced pm_runtime_disable() in probe error path +- spi: spi-qcom-qspi: Fix use-after-free on unbind +- spi: spi-geni-qcom: Fix use-after-free on unbind +- spi: sc18is602: Don't leak SPI master in probe error path +- spi: rpc-if: Fix use-after-free on unbind +- spi: rb4xx: Don't leak SPI master in probe error path +- spi: pic32: Don't leak DMA channels in probe error path +- spi: npcm-fiu: Disable clock in probe error path +- spi: mxic: Don't leak SPI master in probe error path +- spi: gpio: Don't leak SPI master in probe error path +- spi: fsl: fix use of spisel_boot signal on MPC8309 +- spi: davinci: Fix use-after-free on unbind +- spi: ar934x: Don't leak SPI master in probe error path +- spi: spi-mtk-nor: Don't leak SPI master in probe error path +- spi: atmel-quadspi: Fix use-after-free on unbind +- spi: spi-sh: Fix use-after-free on unbind +- spi: pxa2xx: Fix use-after-free on unbind +- iio: ad_sigma_delta: Don't put SPI transfer buffer on the stack +- drm/i915: Fix mismatch between misplaced vma check and vma insert +- drm/dp_aux_dev: check aux_dev before use in drm_dp_aux_dev_get_by_minor() +- drm/amd/display: Fix memory leaks in S3 resume +- drm/amdgpu: only set DP subconnector type on DP and eDP connectors +- platform/x86: mlx-platform: remove an unused variable +- drm/panfrost: Move the GPU reset bits outside the timeout handler +- drm/panfrost: Fix job timeout handling +- jfs: Fix array index bounds check in dbAdjTree +- fsnotify: fix events reported to watching parent and child +- inotify: convert to handle_inode_event() interface +- fsnotify: generalize handle_inode_event() +- jffs2: Fix ignoring mounting options problem during remounting +- jffs2: Fix GC exit abnormally +- ubifs: wbuf: Don't leak kernel memory to flash +- SMB3.1.1: do not log warning message if server doesn't populate salt +- SMB3.1.1: remove confusing mount warning when no SPNEGO info on negprot rsp +- SMB3: avoid confusing warning message on mount to Azure +- ceph: fix race in concurrent __ceph_remove_cap invocations +- um: Fix time-travel mode +- um: Remove use of asprinf in umid.c +- ima: Don't modify file descriptor mode on the fly +- ovl: make ioctl() safe +- powerpc/powernv/memtrace: Fix crashing the kernel when enabling concurrently +- powerpc/powernv/memtrace: Don't leak kernel memory to user space +- powerpc/powernv/npu: Do not attempt NPU2 setup on POWER8NVL NPU +- powerpc/mm: Fix verification of MMU_FTR_TYPE_44x +- powerpc/8xx: Fix early debug when SMC1 is relocated +- powerpc/xmon: Change printk() to pr_cont() +- powerpc/feature: Add CPU_FTR_NOEXECUTE to G2_LE +- powerpc/bitops: Fix possible undefined behaviour with fls() and fls64() +- powerpc/rtas: Fix typo of ibm,open-errinjct in RTAS filter +- powerpc: Fix incorrect stw{, ux, u, x} instructions in __set_pte_at +- powerpc/32: Fix vmap stack - Properly set r1 before activating MMU on syscall too +- xprtrdma: Fix XDRBUF_SPARSE_PAGES support +- ARM: tegra: Populate OPP table for Tegra20 Ventana +- ARM: dts: at91: sama5d2: fix CAN message ram offset and size +- ARM: dts: pandaboard: fix pinmux for gpio user button of Pandaboard ES +- iommu/arm-smmu-qcom: Implement S2CR quirk +- iommu/arm-smmu-qcom: Read back stream mappings +- iommu/arm-smmu: Allow implementation specific write_s2cr +- KVM: SVM: Remove the call to sev_platform_status() during setup +- KVM: x86: reinstate vendor-agnostic check on SPEC_CTRL cpuid bits +- KVM: arm64: Introduce handling of AArch32 TTBCR2 traps +- arm64: dts: marvell: keep SMMU disabled by default for Armada 7040 and 8040 +- arm64: dts: ti: k3-am65: mark dss as dma-coherent +- RISC-V: Fix usage of memblock_enforce_memory_limit +- ext4: don't remount read-only with errors=continue on reboot +- ext4: fix deadlock with fs freezing and EA inodes +- ext4: fix a memory leak of ext4_free_data +- ext4: fix an IS_ERR() vs NULL check +- btrfs: fix race when defragmenting leads to unnecessary IO +- btrfs: update last_byte_to_unpin in switch_commit_roots +- btrfs: do not shorten unpin len for caching block groups +- USB: serial: keyspan_pda: fix write unthrottling +- USB: serial: keyspan_pda: fix tx-unthrottle use-after-free +- USB: serial: keyspan_pda: fix write-wakeup use-after-free +- USB: serial: keyspan_pda: fix stalled writes +- USB: serial: keyspan_pda: fix write deadlock +- USB: serial: keyspan_pda: fix dropped unthrottle interrupts +- USB: serial: digi_acceleport: fix write-wakeup deadlocks +- USB: serial: mos7720: fix parallel-port state restore +- dyndbg: fix use before null check +- cpuset: fix race between hotplug work and later CPU offline +- EDAC/amd64: Fix PCI component registration +- EDAC/i10nm: Use readl() to access MMIO registers +- Documentation: seqlock: s/LOCKTYPE/LOCKNAME/g +- m68k: Fix WARNING splat in pmac_zilog driver +- crypto: arm/aes-ce - work around Cortex-A57/A72 silion errata +- crypto: ecdh - avoid unaligned accesses in ecdh_set_secret() +- cpufreq: intel_pstate: Use most recent guaranteed performance values +- powerpc/perf: Exclude kernel samples while counting events in user space. +- perf/x86/intel/lbr: Fix the return type of get_lbr_cycles() +- perf/x86/intel: Fix rtm_abort_event encoding on Ice Lake +- perf/x86/intel: Add event constraint for CYCLE_ACTIVITY.STALLS_MEM_ANY +- z3fold: stricter locking and more careful reclaim +- z3fold: simplify freeing slots +- staging: comedi: mf6x4: Fix AI end-of-conversion detection +- ASoC: AMD Raven/Renoir - fix the PCI probe (PCI revision) +- ASoC: AMD Renoir - add DMI table to avoid the ACP mic probe (broken BIOS) +- ASoC: cx2072x: Fix doubly definitions of Playback and Capture streams +- binder: add flag to clear buffer on txn complete +- s390/dasd: fix list corruption of lcu list +- s390/dasd: fix list corruption of pavgroup group list +- s390/dasd: prevent inconsistent LCU device data +- s390/dasd: fix hanging device offline processing +- s390/idle: fix accounting with machine checks +- s390/idle: add missing mt_cycles calculation +- s390/kexec_file: fix diag308 subcode when loading crash kernel +- s390/smp: perform initial CPU reset also for SMT siblings +- ALSA: core: memalloc: add page alignment for iram +- ALSA: usb-audio: Add alias entry for ASUS PRIME TRX40 PRO-S +- ALSA: usb-audio: Disable sample read check if firmware doesn't give back +- ALSA: usb-audio: Add VID to support native DSD reproduction on FiiO devices +- ALSA: hda/realtek - Supported Dell fixed type headset +- ALSA: hda/realtek: Remove dummy lineout on Acer TravelMate P648/P658 +- ALSA: hda/realtek: Apply jack fixup for Quanta NL3 +- ALSA: hda/realtek: Add quirk for MSI-GP73 +- ALSA/hda: apply jack fixup for the Acer Veriton N4640G/N6640G/N2510G +- ALSA: pcm: oss: Fix a few more UBSAN fixes +- ALSA: hda/realtek - Add supported for more Lenovo ALC285 Headset Button +- ALSA: hda/realtek - Enable headset mic of ASUS Q524UQK with ALC255 +- ALSA: hda/realtek - Enable headset mic of ASUS X430UN with ALC256 +- ALSA: hda/realtek: make bass spk volume adjustable on a yoga laptop +- ALSA: hda/ca0132 - Fix AE-5 rear headphone pincfg. +- ALSA: hda: Fix regressions on clear and reconfig sysfs +- ACPI: PNP: compare the string length in the matching_id() +- Revert "ACPI / resources: Use AE_CTRL_TERMINATE to terminate resources walks" +- PM: ACPI: PCI: Drop acpi_pm_set_bridge_wakeup() +- ACPI: NFIT: Fix input validation of bus-family +- ALSA: hda/ca0132 - Change Input Source enum strings. +- Input: cyapa_gen6 - fix out-of-bounds stack access +- media: ipu3-cio2: Make the field on subdev format V4L2_FIELD_NONE +- media: ipu3-cio2: Validate mbus format in setting subdev format +- media: ipu3-cio2: Serialise access to pad format +- media: ipu3-cio2: Return actual subdev format +- media: ipu3-cio2: Remove traces of returned buffers +- media: netup_unidvb: Don't leak SPI master in probe error path +- media: sunxi-cir: ensure IR is handled when it is continuous +- io_uring: make ctx cancel on exit targeted to actual ctx +- io_uring: fix double io_uring free +- io_uring: fix ignoring xa_store errors +- io_uring: hold uring_lock while completing failed polled io in io_wq_submit_work() +- io_uring: fix 0-iov read buffer select +- io_uring: fix io_wqe->work_list corruption +- media: gspca: Fix memory leak in probe +- vfio/pci/nvlink2: Do not attempt NPU2 setup on POWER8NVL NPU +- vfio/pci: Move dummy_resources_list init in vfio_pci_probe() +- io_uring: always let io_iopoll_complete() complete polled io +- io_uring: fix racy IOPOLL completions +- io_uring: fix io_cqring_events()'s noflush +- proc mountinfo: make splice available again +- Smack: Handle io_uring kernel thread privileges +- io_uring: cancel reqs shouldn't kill overflow list +- io_uring: fix racy IOPOLL flush overflow +- perf probe: Fix memory leak when synthesizing SDT probes +- ARM: 9036/1: uncompress: Fix dbgadtb size parameter name +- ARM: 9044/1: vfp: use undef hook for VFP support detection +- powerpc/smp: Add __init to init_big_cores() +- powerpc/boot: Fix build of dts/fsl +- kconfig: fix return value of do_error_if() +- clk: vc5: Use "idt,voltage-microvolt" instead of "idt,voltage-microvolts" +- clk: sunxi-ng: Make sure divider tables have sentinel +- clk: s2mps11: Fix a resource leak in error handling paths in the probe function +- clk: at91: sam9x60: remove atmel,osc-bypass support +- clk: at91: sama7g5: fix compilation error +- clk: bcm: dvp: Add MODULE_DEVICE_TABLE() +- epoll: check for events when removing a timed out thread from the wait queue +- vhost scsi: fix error return code in vhost_scsi_set_endpoint() +- virtio_ring: Fix two use after free bugs +- virtio_net: Fix error code in probe() +- virtio_ring: Cut and paste bugs in vring_create_virtqueue_packed() +- vdpa/mlx5: Use write memory barrier after updating CQ index +- nfp: move indirect block cleanup to flower app stop callback +- qlcnic: Fix error code in probe +- perf record: Fix memory leak when using '--user-regs=?' to list registers +- tools build: Add missing libcap to test-all.bin target +- io_uring: cancel only requests of current task +- pwm: sun4i: Remove erroneous else branch +- pwm: imx27: Fix overflow for bigger periods +- pwm: lp3943: Dynamically allocate PWM chip base +- pwm: zx: Add missing cleanup in error path +- clk: ti: Fix memleak in ti_fapll_synth_setup +- watchdog: coh901327: add COMMON_CLK dependency +- watchdog: qcom: Avoid context switch in restart handler +- powerpc/32s: Fix cleanup_cpu_mmu_context() compile bug +- libnvdimm/label: Return -ENXIO for no slot in __blk_label_update +- devlink: use _BITUL() macro instead of BIT() in the UAPI header +- net: korina: fix return value +- NFS/pNFS: Fix a typo in ff_layout_resend_pnfs_read() +- block/rnbd-clt: Fix possible memleak +- block/rnbd-clt: Get rid of warning regarding size argument in strlcpy +- net: allwinner: Fix some resources leak in the error handling path of the probe and in the remove function +- net: mscc: ocelot: Fix a resource leak in the error handling path of the probe function +- net: bcmgenet: Fix a resource leak in an error handling path in the probe functin +- dpaa2-eth: fix the size of the mapped SGT buffer +- net: dsa: qca: ar9331: fix sleeping function called from invalid context bug +- i40e, xsk: clear the status bits for the next_to_use descriptor +- ice, xsk: clear the status bits for the next_to_use descriptor +- lan743x: fix rx_napi_poll/interrupt ping-pong +- s390/test_unwind: fix CALL_ON_STACK tests +- checkpatch: fix unescaped left brace +- proc: fix lookup in /proc/net subdirectories after setns(2) +- mm: don't wake kswapd prematurely when watermark boosting is disabled +- hugetlb: fix an error code in hugetlb_reserve_pages() +- mm,memory_failure: always pin the page in madvise_inject_error +- mm/vmalloc.c: fix kasan shadow poisoning size +- mm/vmalloc: Fix unlock order in s_stop() +- sparc: fix handling of page table constructor failure +- mm/rmap: always do TTU_IGNORE_ACCESS +- mm: memcg/slab: fix use after free in obj_cgroup_charge +- mm: memcg/slab: fix return of child memcg objcg for root memcg +- mm/gup: combine put_compound_head() and unpin_user_page() +- mm/gup: prevent gup_fast from racing with COW during fork +- mm/gup: reorganize internal_get_user_pages_fast() +- drm/amdgpu: fix regression in vbios reservation handling on headless +- perf test: Fix metric parsing test +- powerpc/ps3: use dma_mapping_error() +- powerpc/perf: Fix Threshold Event Counter Multiplier width for P10 +- drm: mxsfb: Silence -EPROBE_DEFER while waiting for bridge +- nfc: s3fwrn5: Release the nfc firmware +- RDMA/cma: Don't overwrite sgid_attr after device is released +- RDMA/mlx5: Fix MR cache memory leak +- sunrpc: fix xs_read_xdr_buf for partial pages receive +- um: chan_xterm: Fix fd leak +- um: tty: Fix handling of close in tty lines +- um: Monitor error events in IRQ controller +- ubifs: Fix error return code in ubifs_init_authentication() +- watchdog: Fix potential dereferencing of null pointer +- watchdog: sprd: check busy bit before new loading rather than after that +- watchdog: sprd: remove watchdog disable from resume fail path +- watchdog: sirfsoc: Add missing dependency on HAS_IOMEM +- watchdog: armada_37xx: Add missing dependency on HAS_IOMEM +- irqchip/qcom-pdc: Fix phantom irq when changing between rising/falling +- ath11k: Fix incorrect tlvs in scan start command +- gpiolib: irq hooks: fix recursion in gpiochip_irq_unmask +- RDMA/hns: Do shift on traffic class when using RoCEv2 +- RDMA/hns: Normalization the judgment of some features +- RDMA/hns: Limit the length of data copied between kernel and userspace +- dmaengine: ti: k3-udma: Correct normal channel offset when uchan_cnt is not 0 +- irqchip/ti-sci-intr: Fix freeing of irqs +- irqchip/ti-sci-inta: Fix printing of inta id on probe success +- irqchip/alpine-msi: Fix freeing of interrupts on allocation error path +- ASoC: wm_adsp: remove "ctl" from list on error in wm_adsp_create_control() +- mac80211: fix a mistake check for rx_stats update +- mac80211: don't set set TDLS STA bandwidth wider than possible +- crypto: atmel-i2c - select CONFIG_BITREVERSE +- extcon: max77693: Fix modalias string +- fs: Handle I_DONTCACHE in iput_final() instead of generic_drop_inode() +- samples/bpf: Fix possible hang in xdpsock with multiple threads +- mtd: rawnand: gpmi: Fix the random DMA timeout issue +- mtd: rawnand: meson: Fix a resource leak in init +- mtd: rawnand: gpmi: fix reference count leak in gpmi ops +- clk: tegra: Fix duplicated SE clock entry +- clk: qcom: gcc-sc7180: Use floor ops for sdcc clks +- remoteproc/mediatek: unprepare clk if scp_before_load fails +- remoteproc: qcom: Fix potential NULL dereference in adsp_init_mmio() +- remoteproc: k3-dsp: Fix return value check in k3_dsp_rproc_of_get_memories() +- remoteproc: qcom: pas: fix error handling in adsp_pds_enable +- remoteproc: qcom: fix reference leak in adsp_start +- remoteproc: q6v5-mss: fix error handling in q6v5_pds_enable +- remoteproc/mtk_scp: surround DT device IDs with CONFIG_OF +- remoteproc/mediatek: change MT8192 CFG register base +- RDMA/uverbs: Fix incorrect variable type +- RDMA/core: Do not indicate device ready when device enablement fails +- ALSA: hda/hdmi: fix silent stream for first playback to DP +- slimbus: qcom: fix potential NULL dereference in qcom_slim_prg_slew() +- powerpc/sstep: Cover new VSX instructions under CONFIG_VSX +- powerpc/sstep: Emulate prefixed instructions only when CPU_FTR_ARCH_31 is set +- can: m_can: m_can_config_endisable(): remove double clearing of clock stop request bit +- clk: renesas: r8a779a0: Fix R and OSC clocks +- erofs: avoid using generic_block_bmap +- iwlwifi: mvm: hook up missing RX handlers +- iwlwifi: dbg-tlv: fix old length in is_trig_data_contained() +- s390/cio: fix use-after-free in ccw_device_destroy_console +- fsi: Aspeed: Add mutex to protect HW access +- bus: fsl-mc: fix error return code in fsl_mc_object_allocate() +- bus: fsl-mc: add back accidentally dropped error check +- misc: pci_endpoint_test: fix return value of error branch +- platform/chrome: cros_ec_spi: Don't overwrite spi::mode +- scsi: qla2xxx: Fix N2N and NVMe connect retry failure +- scsi: qla2xxx: Fix FW initialization error on big endian machines +- x86/kprobes: Restore BTF if the single-stepping is cancelled +- nfs_common: need lock during iterate through the list +- NFSD: Fix 5 seconds delay when doing inter server copy +- nfsd: Fix message level for normal termination +- speakup: fix uninitialized flush_lock +- usb: oxu210hp-hcd: Fix memory leak in oxu_create +- usb: ehci-omap: Fix PM disable depth umbalance in ehci_hcd_omap_probe +- powerpc/mm: sanity_check_fault() should work for all, not only BOOK3S +- ASoC: max98390: Fix error codes in max98390_dsm_init() +- coresight: remove broken __exit annotations +- ASoC: amd: change clk_get() to devm_clk_get() and add missed checks +- drm/mediatek: avoid dereferencing a null hdmi_phy on an error message +- powerpc/powermac: Fix low_sleep_handler with CONFIG_VMAP_STACK +- powerpc/pseries/hibernation: remove redundant cacheinfo update +- powerpc/pseries/hibernation: drop pseries_suspend_begin() from suspend ops +- ARM: 9030/1: entry: omit FP emulation for UND exceptions taken in kernel mode +- platform/x86: mlx-platform: Fix item counter assignment for MSN2700/ComEx system +- platform/x86: mlx-platform: Fix item counter assignment for MSN2700, MSN24xx systems +- scsi: fnic: Fix error return code in fnic_probe() +- seq_buf: Avoid type mismatch for seq_buf_init +- scsi: iscsi: Fix inappropriate use of put_device() +- scsi: pm80xx: Fix error return in pm8001_pci_probe() +- scsi: qedi: Fix missing destroy_workqueue() on error in __qedi_probe +- clk: fsl-sai: fix memory leak +- arm64: dts: meson: g12b: w400: fix PHY deassert timing requirements +- arm64: dts: meson: g12a: x96-max: fix PHY deassert timing requirements +- ARM: dts: meson: fix PHY deassert timing requirements +- arm64: dts: meson: fix PHY deassert timing requirements +- arm64: dts: meson: g12b: odroid-n2: fix PHY deassert timing requirements +- mtd: spi-nor: atmel: fix unlock_all() for AT25FS010/040 +- mtd: spi-nor: atmel: remove global protection flag +- mtd: spi-nor: ignore errors in spi_nor_unlock_all() +- mtd: spi-nor: sst: fix BPn bits for the SST25VF064C +- adm8211: fix error return code in adm8211_probe() +- platform/x86: intel-vbtn: Fix SW_TABLET_MODE always reporting 1 on some HP x360 models +- Bluetooth: btusb: Fix detection of some fake CSR controllers with a bcdDevice val of 0x0134 +- block/rnbd: fix a null pointer dereference on dev->blk_symlink_name +- block/rnbd-clt: Dynamically alloc buffer for pathname & blk_symlink_name +- Bluetooth: sco: Fix crash when using BT_SNDMTU/BT_RCVMTU option +- Bluetooth: btmtksdio: Add the missed release_firmware() in mtk_setup_firmware() +- Bluetooth: btusb: Add the missed release_firmware() in btusb_mtk_setup_firmware() +- spi: dw: Fix error return code in dw_spi_bt1_probe() +- staging: greybus: audio: Fix possible leak free widgets in gbaudio_dapm_free_controls +- staging: bcm2835: fix vchiq_mmal dependencies +- macintosh/adb-iop: Send correct poll command +- macintosh/adb-iop: Always wait for reply message from IOP +- cpufreq: imx: fix NVMEM_IMX_OCOTP dependency +- cpufreq: vexpress-spc: Add missing MODULE_ALIAS +- cpufreq: scpi: Add missing MODULE_ALIAS +- cpufreq: loongson1: Add missing MODULE_ALIAS +- cpufreq: sun50i: Add missing MODULE_DEVICE_TABLE +- cpufreq: st: Add missing MODULE_DEVICE_TABLE +- cpufreq: qcom: Add missing MODULE_DEVICE_TABLE +- cpufreq: mediatek: Add missing MODULE_DEVICE_TABLE +- cpufreq: highbank: Add missing MODULE_DEVICE_TABLE +- cpufreq: ap806: Add missing MODULE_DEVICE_TABLE +- clocksource/drivers/arm_arch_timer: Correct fault programming of CNTKCTL_EL1.EVNTI +- clocksource/drivers/arm_arch_timer: Use stable count reader in erratum sne +- drm/msm: add IOMMU_SUPPORT dependency +- drm/msm: a5xx: Make preemption reset case reentrant +- memory: jz4780_nemc: Fix potential NULL dereference in jz4780_nemc_probe() +- memory: ti-emif-sram: only build for ARMv7 +- phy: renesas: rcar-gen3-usb2: disable runtime pm in case of failure +- phy: mediatek: allow compile-testing the hdmi phy +- ASoC: qcom: fix QDSP6 dependencies, attempt #3 +- ASoC: atmel: mchp-spdifrx needs COMMON_CLK +- ASoC: cros_ec_codec: fix uninitialized memory read +- dm ioctl: fix error return code in target_message +- ASoC: q6afe-clocks: Add missing parent clock rate +- ASoC: jz4740-i2s: add missed checks for clk_get() +- mt76: fix tkip configuration for mt7615/7663 devices +- mt76: fix memory leak if device probing fails +- net/mlx5: Properly convey driver version to firmware +- mt76: dma: fix possible deadlock running mt76_dma_cleanup +- mt76: set fops_tx_stats.owner to THIS_MODULE +- mt76: mt7915: set fops_sta_stats.owner to THIS_MODULE +- mt76: mt7663s: fix a possible ple quota underflow +- MIPS: Don't round up kernel sections size for memblock_add() +- memstick: r592: Fix error return in r592_probe() +- arm64: dts: rockchip: Fix UART pull-ups on rk3328 +- soc: rockchip: io-domain: Fix error return code in rockchip_iodomain_probe() +- pinctrl: falcon: add missing put_device() call in pinctrl_falcon_probe() +- selftests/bpf: Fix invalid use of strncat in test_sockmap +- bpf: Fix bpf_put_raw_tracepoint()'s use of __module_address() +- scripts: kernel-doc: fix parsing function-like typedefs +- ARM: dts: at91: sama5d2: map securam as device +- ARM: dts: at91: sam9x60ek: remove bypass property +- libbpf: Sanitise map names before pinning +- iio: hrtimer-trigger: Mark hrtimer to expire in hard interrupt context +- arm64: mte: fix prctl(PR_GET_TAGGED_ADDR_CTRL) if TCF0=NONE +- clocksource/drivers/riscv: Make RISCV_TIMER depends on RISCV_SBI +- clocksource/drivers/ingenic: Fix section mismatch +- clocksource/drivers/cadence_ttc: Fix memory leak in ttc_setup_clockevent() +- clocksource/drivers/orion: Add missing clk_disable_unprepare() on error path +- powerpc/perf: Fix the PMU group constraints for threshold events in power10 +- powerpc/perf: Update the PMU group constraints for l2l3 events in power10 +- powerpc/perf: Fix to update radix_scope_qual in power10 +- powerpc/xmon: Fix build failure for 8xx +- powerpc/64: Fix an EMIT_BUG_ENTRY in head_64.S +- powerpc/perf: Fix crash with is_sier_available when pmu is not set +- media: saa7146: fix array overflow in vidioc_s_audio() +- media: tvp5150: Fix wrong return value of tvp5150_parse_dt() +- f2fs: fix double free of unicode map +- hwmon: (ina3221) Fix PM usage counter unbalance in ina3221_write_enable +- vfio-pci: Use io_remap_pfn_range() for PCI IO memory +- selftests/seccomp: Update kernel config +- NFS: switch nfsiod to be an UNBOUND workqueue. +- lockd: don't use interval-based rebinding over TCP +- net: sunrpc: Fix 'snprintf' return value check in 'do_xprt_debugfs' +- NFSv4: Fix the alignment of page data in the getdeviceinfo reply +- SUNRPC: xprt_load_transport() needs to support the netid "rdma6" +- NFSv4.2: condition READDIR's mask for security label based on LSM state +- SUNRPC: rpc_wake_up() should wake up tasks in the correct order +- ath10k: Release some resources in an error handling path +- ath10k: Fix an error handling path +- ath10k: Fix the parsing error in service available event +- ath11k: Fix an error handling path +- ath11k: Reset ath11k_skb_cb before setting new flags +- ath11k: Don't cast ath11k_skb_cb to ieee80211_tx_info.control +- media: i2c: imx219: Selection compliance fixes +- media: rdacm20: Enable GPIO1 explicitly +- media: max9271: Fix GPIO enable/disable +- ASoC: Intel: Boards: tgl_max98373: update TDM slot_width +- platform/x86: dell-smbios-base: Fix error return code in dell_smbios_init +- soundwire: master: use pm_runtime_set_active() on add +- mailbox: arm_mhu_db: Fix mhu_db_shutdown by replacing kfree with devm_kfree +- RDMA/hns: Bugfix for calculation of extended sge +- RDMA/hns: Fix 0-length sge calculation error +- ARM: dts: at91: at91sam9rl: fix ADC triggers +- spi: spi-fsl-dspi: Use max_native_cs instead of num_chipselect to set SPI_MCR +- scsi: pm80xx: Do not sleep in atomic context +- scsi: hisi_sas: Fix up probe error handling for v3 hw +- soc: amlogic: canvas: add missing put_device() call in meson_canvas_get() +- arm64: dts: meson-sm1: fix typo in opp table +- arm64: dts: meson: fix spi-max-frequency on Khadas VIM2 +- PCI: iproc: Invalidate correct PAXB inbound windows +- PCI: iproc: Fix out-of-bound array accesses +- PCI: Fix overflow in command-line resource alignment requests +- PCI: Bounds-check command-line resource alignment requests +- arm64: dts: qcom: c630: Fix pinctrl pins properties +- arm64: dts: qcom: c630: Polish i2c-hid devices +- phy: tegra: xusb: Fix usb_phy device driver field +- arm64: dts: freescale: sl28: combine SPI MTD partitions +- arm64: dts: ls1028a: fix FlexSPI clock input +- arm64: dts: ls1028a: fix ENETC PTP clock input +- genirq/irqdomain: Don't try to free an interrupt that has no mapping +- power: supply: bq24190_charger: fix reference leak +- power: supply: axp288_charger: Fix HP Pavilion x2 10 DMI matching +- power: supply: max17042_battery: Fix current_{avg,now} hiding with no current sense +- arm64: dts: rockchip: Set dr_mode to "host" for OTG on rk3328-roc-cc +- power: supply: bq25890: Use the correct range for IILIM register +- arm64: dts: armada-3720-turris-mox: update ethernet-phy handle name +- ARM: dts: Remove non-existent i2c1 from 98dx3236 +- HSI: omap_ssi: Don't jump to free ID in ssi_add_controller() +- drm/mediatek: Use correct aliases name for ovl +- RDMA/core: Track device memory MRs +- slimbus: qcom-ngd-ctrl: Avoid sending power requests without QMI +- media: max2175: fix max2175_set_csm_mode() error code +- mips: cdmm: fix use-after-free in mips_cdmm_bus_discover +- media: imx214: Fix stop streaming +- samples: bpf: Fix lwt_len_hist reusing previous BPF map +- serial: 8250-mtk: Fix reference leak in mtk8250_probe +- RDMA/hns: Avoid setting loopback indicator when smac is same as dmac +- RDMA/hns: Fix missing fields in address vector +- RDMA/hns: Only record vlan info for HIP08 +- arm64: dts: qcom: sc7180: limit IPA iommu streams +- platform/x86: mlx-platform: Remove PSU EEPROM from MSN274x platform configuration +- platform/x86: mlx-platform: Remove PSU EEPROM from default platform configuration +- media: siano: fix memory leak of debugfs members in smsdvb_hotplug +- drm/imx/dcss: fix rotations for Vivante tiled formats +- soundwire: qcom: Fix build failure when slimbus is module +- RDMA/cma: Fix deadlock on &lock in rdma_cma_listen_on_all() error unwind +- arm64: tegra: Fix DT binding for IO High Voltage entry +- leds: turris-omnia: check for LED_COLOR_ID_RGB instead LED_COLOR_ID_MULTI +- leds: lp50xx: Fix an error handling path in 'lp50xx_probe_dt()' +- leds: netxbig: add missing put_device() call in netxbig_leds_get_of_pdata() +- arm64: dts: qcom: sdm845: Limit ipa iommu streams +- dmaengine: mv_xor_v2: Fix error return code in mv_xor_v2_probe() +- cw1200: fix missing destroy_workqueue() on error in cw1200_init_common +- rsi: fix error return code in rsi_reset_card() +- qtnfmac: fix error return code in qtnf_pcie_probe() +- orinoco: Move context allocation after processing the skb +- brcmfmac: fix error return code in brcmf_cfg80211_connect() +- mmc: pxamci: Fix error return code in pxamci_probe +- ARM: dts: at91: sama5d3_xplained: add pincontrol for USB Host +- ARM: dts: at91: sama5d4_xplained: add pincontrol for USB Host +- ARM: dts: at91: sam9x60: add pincontrol for USB Host +- memstick: fix a double-free bug in memstick_check +- pinctrl: sunxi: fix irq bank map for the Allwinner A100 pin controller +- soundwire: Fix DEBUG_LOCKS_WARN_ON for uninitialized attribute +- RDMA/cxgb4: Validate the number of CQEs +- ath11k: Fix the rx_filter flag setting for peer rssi stats +- staging: mfd: hi6421-spmi-pmic: fix error return code in hi6421_spmi_pmic_probe() +- clk: meson: Kconfig: fix dependency for G12A +- Input: omap4-keypad - fix runtime PM error handling +- arm64: dts: qcom: msm8916-samsung-a2015: Disable muic i2c pin bias +- arm64: dts: qcom: sm8250: correct compatible for sm8250-mtp +- soc: qcom: initialize local variable +- drivers: soc: ti: knav_qmss_queue: Fix error return code in knav_queue_probe +- soc: ti: Fix reference imbalance in knav_dma_probe +- soc: ti: knav_qmss: fix reference leak in knav_queue_probe +- PCI: brcmstb: Initialize "tmp" before use +- PCI: Disable MSI for Pericom PCIe-USB adapter +- drm/meson: dw-hdmi: Enable the iahb clock early enough +- drm/meson: dw-hdmi: Disable clocks on driver teardown +- spi: fix resource leak for drivers without .remove callback +- crypto: sun8i-ce - fix two error path's memory leak +- crypto: omap-aes - Fix PM disable depth imbalance in omap_aes_probe +- crypto: crypto4xx - Replace bitwise OR with logical OR in crypto4xx_build_pd +- rcu/tree: Defer kvfree_rcu() allocation to a clean context +- rcu,ftrace: Fix ftrace recursion +- rcu: Allow rcu_irq_enter_check_tick() from NMI +- scsi: ufs: Fix clkgating on/off +- scsi: ufs: Avoid to call REQ_CLKS_OFF to CLKS_OFF +- EDAC/mce_amd: Use struct cpuinfo_x86.cpu_die_id for AMD NodeId +- mfd: cpcap: Fix interrupt regression with regmap clear_ack +- mfd: stmfx: Fix dev_err_probe() call in stmfx_chip_init() +- mfd: MFD_SL28CPLD should depend on ARCH_LAYERSCAPE +- mfd: htc-i2cpld: Add the missed i2c_put_adapter() in htcpld_register_chip_i2c() +- powerpc/powernv/sriov: fix unsigned int win compared to less than zero +- Revert "powerpc/pseries/hotplug-cpu: Remove double free in error path" +- ARM: dts: tacoma: Fix node vs reg mismatch for flash memory +- powerpc/feature: Fix CPU_FTRS_ALWAYS by removing CPU_FTRS_GENERIC_32 +- powerpc: Avoid broken GCC __attribute__((optimize)) +- selftests/bpf: Fix broken riscv build +- spi: mxs: fix reference leak in mxs_spi_probe +- usb/max3421: fix return error code in max3421_probe() +- bus: mhi: core: Fix null pointer access when parsing MHI configuration +- bus: mhi: core: Remove double locking from mhi_driver_remove() +- Input: ads7846 - fix unaligned access on 7845 +- Input: ads7846 - fix integer overflow on Rt calculation +- Input: ads7846 - fix race that causes missing releases +- iommu/vt-d: include conditionally on CONFIG_INTEL_IOMMU_SVM +- ASoC: intel: SND_SOC_INTEL_KEEMBAY should depend on ARCH_KEEMBAY +- drm/meson: dw-hdmi: Ensure that clocks are enabled before touching the TOP registers +- drm/meson: dw-hdmi: Register a callback to disable the regulator +- drm/meson: Unbind all connectors on module removal +- drm/meson: Free RDMA resources after tearing down DRM +- drm/omap: dmm_tiler: fix return error code in omap_dmm_probe() +- mmc: sdhci: tegra: fix wrong unit with busy_timeout +- video: fbdev: atmel_lcdfb: fix return error code in atmel_lcdfb_of_init() +- media: solo6x10: fix missing snd_card_free in error handling case +- media: venus: put dummy vote on video-mem path after last session release +- scsi: core: Fix VPD LUN ID designator priorities +- spi: dw: fix build error by selecting MULTIPLEXER +- ASoC: meson: fix COMPILE_TEST error +- RDMA/cma: Add missing error handling of listen_id +- media: venus: core: vote with average bandwidth and peak bandwidth as zero +- media: venus: core: vote for video-mem path +- media: venus: core: change clk enable and disable order in resume and suspend +- media: platform: add missing put_device() call in mtk_jpeg_probe() and mtk_jpeg_remove() +- media: cedrus: fix reference leak in cedrus_start_streaming +- media: staging: rkisp1: cap: fix runtime PM imbalance on error +- media: ov5640: fix support of BT656 bus mode +- media: v4l2-fwnode: v4l2_fwnode_endpoint_parse caller must init vep argument +- media: v4l2-fwnode: Return -EINVAL for invalid bus-type +- media: mtk-vcodec: add missing put_device() call in mtk_vcodec_init_enc_pm() +- media: mtk-vcodec: add missing put_device() call in mtk_vcodec_release_dec_pm() +- media: mtk-vcodec: add missing put_device() call in mtk_vcodec_init_dec_pm() +- media: platform: add missing put_device() call in mtk_jpeg_clk_init() +- media: tm6000: Fix sizeof() mismatches +- ionic: change set_rx_mode from_ndo to can_sleep +- ionic: flatten calls to ionic_lif_rx_mode +- ionic: use mc sync for multicast filters +- drm/amdkfd: Put ACPI table after using it +- scripts: kernel-doc: Restore anonymous enum parsing +- staging: gasket: interrupt: fix the missed eventfd_ctx_put() in gasket_interrupt.c +- staging: greybus: codecs: Fix reference counter leak in error handling +- drm/udl: Fix missing error code in udl_handle_damage() +- firmware: arm_scmi: Fix missing destroy_workqueue() +- crypto: qat - fix status check in qat_hal_put_rel_rd_xfer() +- crypto: Kconfig - CRYPTO_MANAGER_EXTRA_TESTS requires the manager +- soc: ti: omap-prm: Do not check rstst bit on deassert if already deasserted +- drm/amdgpu: fix compute queue priority if num_kcq is less than 4 +- MIPS: BCM47XX: fix kconfig dependency bug for BCM47XX_BCMA +- arm64: dts: ti: k3-am65*/j721e*: Fix unit address format error for dss node +- ASoC: SOF: Intel: fix Kconfig dependency for SND_INTEL_DSP_CONFIG +- RDMa/mthca: Work around -Wenum-conversion warning +- ASoC: arizona: Fix a wrong free in wm8997_probe +- virtiofs fix leak in setup +- spi: sprd: fix reference leak in sprd_spi_remove +- ASoC: wm8998: Fix PM disable depth imbalance on error +- ASoC: wm8994: Fix PM disable depth imbalance on error +- selftest/bpf: Add missed ip6ip6 test back +- selftests/run_kselftest.sh: fix dry-run typo +- drm/msm/dp: do not notify audio subsystem if sink doesn't support audio +- drm/msm/dp: skip checking LINK_STATUS_UPDATED bit +- drm/msm/dp: return correct connection status after suspend +- firmware: tegra: fix strncpy()/strncat() confusion +- drm/msm/a5xx: Clear shadow on suspend +- drm/msm/a6xx: Clear shadow on suspend +- mwifiex: fix mwifiex_shutdown_sw() causing sw reset failure +- ath11k: Handle errors if peer creation fails +- ASoC: qcom: common: Fix refcounting in qcom_snd_parse_of() +- spi: imx: fix reference leak in two imx operations +- spi: bcm63xx-hsspi: fix missing clk_disable_unprepare() on error in bcm63xx_hsspi_resume +- spi: tegra114: fix reference leak in tegra spi ops +- spi: tegra20-sflash: fix reference leak in tegra_sflash_resume +- spi: tegra20-slink: fix reference leak in slink ops of tegra20 +- spi: mt7621: fix missing clk_disable_unprepare() on error in mt7621_spi_probe +- spi: spi-ti-qspi: fix reference leak in ti_qspi_setup +- spi: stm32-qspi: fix reference leak in stm32 qspi operations +- Bluetooth: hci_h5: fix memory leak in h5_close +- Bluetooth: Fix: LL PRivacy BLE device fails to connect +- Bluetooth: Fix null pointer dereference in hci_event_packet() +- drm/panel: simple: Add flags to boe_nv133fhm_n61 +- arm64: dts: exynos: Correct psci compatible used on Exynos7 +- arm64: dts: exynos: Include common syscon restart/poweroff for Exynos7 +- brcmfmac: Fix memory leak for unpaired brcmf_{alloc/free} +- ath11k: fix wmi init configuration +- ath11k: Fix number of rules in filtered ETSI regdomain +- ath11k: Initialize complete alpha2 for regulatory change +- drm/edid: Fix uninitialized variable in drm_cvt_modes() +- x86/mce: Correct the detection of invalid notifier priorities +- bpf: Fix tests for local_storage +- spi: stm32: fix reference leak in stm32_spi_resume +- nl80211/cfg80211: fix potential infinite loop +- selinux: fix inode_doinit_with_dentry() LABEL_INVALID error handling +- crypto: caam - fix printing on xts fallback allocation error path +- crypto: arm/aes-neonbs - fix usage of cbc(aes) fallback +- crypto: arm64/poly1305-neon - reorder PAC authentication with SP update +- drm/bridge: tpd12s015: Fix irq registering in tpd12s015_probe +- ASoC: pcm: DRAIN support reactivation +- pinctrl: core: Add missing #ifdef CONFIG_GPIOLIB +- scsi: aacraid: Improve compat_ioctl handlers +- spi: spi-mem: fix reference leak in spi_mem_access_start +- drm/msm/dpu: fix clock scaling on non-sc7180 board +- drm/msm/dsi_pll_10nm: restore VCO rate during restore_state +- drm/msm/dsi_pll_7nm: restore VCO rate during restore_state +- drm/msm/dp: DisplayPort PHY compliance tests fixup +- perf test: Use generic event for expand_libpfm_events() +- RDMA/mlx5: Fix corruption of reg_pages in mlx5_ib_rereg_user_mr() +- f2fs: call f2fs_get_meta_page_retry for nat page +- spi: img-spfi: fix reference leak in img_spfi_resume +- powerpc/64: Set up a kernel stack for secondaries before cpu_restore() +- drm/amdgpu: fix build_coefficients() argument +- ARM: dts: aspeed: tiogapass: Remove vuart +- drm/msm: Add missing stub definition +- ASoC: sun4i-i2s: Fix lrck_period computation for I2S justified mode +- crypto: inside-secure - Fix sizeof() mismatch +- crypto: talitos - Fix return type of current_desc_hdr() +- crypto: talitos - Endianess in current_desc_hdr() +- drm/amdgpu: fix incorrect enum type +- sched: Reenable interrupts in do_sched_yield() +- sched/deadline: Fix sched_dl_global_validate() +- ASoC: qcom: fix unsigned int bitwidth compared to less than zero +- x86/apic: Fix x2apic enablement without interrupt remapping +- RDMA/rtrs-srv: Don't guard the whole __alloc_srv with srv_mutex +- RDMA/rtrs-clt: Missing error from rtrs_rdma_conn_established +- RDMA/rtrs-clt: Remove destroy_con_cq_qp in case route resolving failed +- ARM: p2v: fix handling of LPAE translation in BE mode +- x86/mm/ident_map: Check for errors from ident_pud_init() +- RDMA/rxe: Compute PSN windows correctly +- RDMA/core: Fix error return in _ib_modify_qp() +- ARM: dts: aspeed: s2600wf: Fix VGA memory region location +- ARM: dts: aspeed-g6: Fix the GPIO memory size +- selinux: fix error initialization in inode_doinit_with_dentry() +- RDMA/bnxt_re: Fix entry size during SRQ create +- rtc: pcf2127: fix pcf2127_nvmem_read/write() returns +- RDMA/bnxt_re: Set queue pair state when being queried +- Revert "i2c: i2c-qcom-geni: Fix DMA transfer race" +- soc: qcom: geni: More properly switch to DMA mode +- arm64: dts: qcom: sc7180: Fix one forgotten interconnect reference +- arm64: dts: ipq6018: update the reserved-memory node +- arm64: dts: mediatek: mt8183: fix gce incorrect mbox-cells value +- soc: mediatek: Check if power domains can be powered on at boot time +- soc: renesas: rmobile-sysc: Fix some leaks in rmobile_init_pm_domains() +- arm64: dts: renesas: cat875: Remove rxc-skew-ps from ethernet-phy node +- arm64: dts: renesas: hihope-rzg2-ex: Drop rxc-skew-ps from ethernet-phy node +- drm/tve200: Fix handling of platform_get_irq() error +- drm/mcde: Fix handling of platform_get_irq() error +- drm/aspeed: Fix Kconfig warning & subsequent build errors +- iio: adc: at91_adc: add Kconfig dep on the OF symbol and remove of_match_ptr() +- drm/gma500: fix double free of gma_connector +- hwmon: (k10temp) Remove support for displaying voltage and current on Zen CPUs +- md: fix a warning caused by a race between concurrent md_ioctl()s +- nl80211: validate key indexes for cfg80211_registered_device +- crypto: af_alg - avoid undefined behavior accessing salg_name +- media: msi2500: assign SPI bus number dynamically +- fs: quota: fix array-index-out-of-bounds bug by passing correct argument to vfs_cleanup_quota_inode() +- quota: Sanity-check quota file headers on load +- Bluetooth: Fix slab-out-of-bounds read in hci_le_direct_adv_report_evt() +- f2fs: prevent creating duplicate encrypted filenames +- ext4: prevent creating duplicate encrypted filenames +- ubifs: prevent creating duplicate encrypted filenames +- fscrypt: add fscrypt_is_nokey_name() +- fscrypt: remove kernel-internal constants from UAPI header +- serial_core: Check for port state when tty is in error state +- HID: i2c-hid: add Vero K147 to descriptor override +- scsi: megaraid_sas: Check user-provided offsets +- f2fs: init dirty_secmap incorrectly +- f2fs: fix to seek incorrect data offset in inline data file +- coresight: etm4x: Handle TRCVIPCSSCTLR accesses +- coresight: etm4x: Fix accesses to TRCPROCSELR +- coresight: etm4x: Fix accesses to TRCCIDCTLR1 +- coresight: etm4x: Fix accesses to TRCVMIDCTLR1 +- coresight: etm4x: Skip setting LPOVERRIDE bit for qcom, skip-power-up +- coresight: etb10: Fix possible NULL ptr dereference in etb_enable_perf() +- coresight: tmc-etr: Fix barrier packet insertion for perf buffer +- coresight: tmc-etr: Check if page is valid before dma_map_page() +- coresight: tmc-etf: Fix NULL ptr dereference in tmc_enable_etf_sink_perf() +- ARM: dts: exynos: fix USB 3.0 pins supply being turned off on Odroid XU +- ARM: dts: exynos: fix USB 3.0 VBUS control and over-current pins on Exynos5410 +- ARM: dts: exynos: fix roles of USB 3.0 ports on Odroid XU +- usb: chipidea: ci_hdrc_imx: Pass DISABLE_DEVICE_STREAMING flag to imx6ul +- USB: gadget: f_rndis: fix bitrate for SuperSpeed and above +- usb: gadget: f_fs: Re-use SS descriptors for SuperSpeedPlus +- USB: gadget: f_midi: setup SuperSpeed Plus descriptors +- USB: gadget: f_acm: add support for SuperSpeed Plus +- USB: serial: option: add interface-number sanity check to flag handling +- usb: mtu3: fix memory corruption in mtu3_debugfs_regset() +- soc/tegra: fuse: Fix index bug in get_process_id +- exfat: Avoid allocating upcase table using kcalloc() +- x86/split-lock: Avoid returning with interrupts enabled +- net: ipconfig: Avoid spurious blank lines in boot log +- serial: 8250_omap: Avoid FIFO corruption caused by MDR1 access +- ALSA: pcm: oss: Fix potential out-of-bounds shift +- USB: sisusbvga: Make console support depend on BROKEN +- USB: UAS: introduce a quirk to set no_write_same +- xhci-pci: Allow host runtime PM as default for Intel Maple Ridge xHCI +- xhci-pci: Allow host runtime PM as default for Intel Alpine Ridge LP +- usb: xhci: Set quirk for XHCI_SG_TRB_CACHE_SIZE_QUIRK +- xhci: Give USB2 ports time to enter U3 in bus suspend +- ALSA: usb-audio: Fix control 'access overflow' errors from chmap +- ALSA: usb-audio: Fix potential out-of-bounds shift +- USB: add RESET_RESUME quirk for Snapscan 1212 +- USB: dummy-hcd: Fix uninitialized array use in init() +- USB: legotower: fix logical error in recent commit +- ktest.pl: Fix the logic for truncating the size of the log file for email +- ktest.pl: If size of log is too big to email, email error message +- ptrace: Prevent kernel-infoleak in ptrace_get_syscall_info() +- arm64: cache: Export and add cache invalidation and clean ABIs for module use +- arm64: cache: Add flush_dcache_area() for module use +- security: restrict init parameters by configuration +- PCI: Add MCFG quirks for some Hisilicon Chip host controllers +- fs/dirty_pages: remove set but not used variable 'm' +- fs/dirty_pages: fix kernel panic in concurrency mode +- fs/dirty_pages: Adjust position of some code to improve the code +- fs/dirty_pages: fix wrong 'buff_num' after invalid input +- fs/dirty_pages: fix index out of bounds and integer overflow +- fs/dirty_pages: dump the number of dirty pages for each inode +- mm, page_alloc: avoid page_to_pfn() in move_freepages() +- dt-bindings/irqchip/mbigen: add example of MBIGEN generate SPIs +- irqchip/mbigen: add support for a MBIGEN generating SPIs +- irqchip/mbigen: rename register marcros +- ilp32: skip ARM erratum 1418040 for ilp32 application +- ilp32: avoid clearing upper 32 bits of syscall return value for ilp32 +- arm64: secomp: fix the secure computing mode 1 syscall check for ilp32 +- arm64:ilp32: add ARM64_ILP32 to Kconfig +- arm64:ilp32: add vdso-ilp32 and use for signal return +- arm64: ptrace: handle ptrace_request differently for aarch32 and ilp32 +- arm64: ilp32: introduce ilp32-specific sigframe and ucontext +- arm64: signal32: move ilp32 and aarch32 common code to separated file +- arm64: signal: share lp64 signal structures and routines to ilp32 +- arm64: ilp32: introduce syscall table for ILP32 +- arm64: ilp32: share aarch32 syscall handlers +- arm64: ilp32: introduce binfmt_ilp32.c +- arm64: change compat_elf_hwcap and compat_elf_hwcap2 prefix to a32 +- arm64: introduce binfmt_elf32.c +- arm64: introduce AUDIT_ARCH_AARCH64ILP32 for ilp32 +- arm64: ilp32: add is_ilp32_compat_{task,thread} and TIF_32BIT_AARCH64 +- arm64: introduce is_a32_compat_{task,thread} for AArch32 compat +- arm64: uapi: set __BITS_PER_LONG correctly for ILP32 and LP64 +- arm64: rename functions that reference compat term +- arm64: rename COMPAT to AARCH32_EL0 +- arm64: ilp32: add documentation on the ILP32 ABI for ARM64 +- thread: move thread bits accessors to separated file +- ptrace: Add compat PTRACE_{G,S}ETSIGMASK handlers +- arm64: signal: Make parse_user_sigframe() independent of rt_sigframe layout +- ARM: mm: non-LPAE systems HugeTLB support for hulk +- Revert "dm raid: fix discard limits for raid1 and raid10" +- Revert "md: change mddev 'chunk_sectors' from int to unsigned" + +* Wed Dec 16 2020 Xie XiuQi - 5.10.0-0.0.0.7 +- rebase on top of v5.10 + +* Wed Dec 09 2020 Xie XiuQi - 5.10.0-rc7.0.0.6 +- rebase on top of v5.10-rc7 + +* Tue Nov 17 2020 Xie XiuQi - 5.10.0-rc4.0.0.5 +- rebase on top of v5.10-rc4 +- kernel.spec: privode config files in src package + +* Mon Nov 09 2020 Xie XiuQi - 5.10.0-rc3.0.0.4 +- use rcX for v5.10-rcX source release +- rebase on top of v5.10-rc3 +- kernel.spec: add missing debuginfodir + +* Mon Nov 02 2020 Xie XiuQi - 5.10.0-rc2.0.0.3 +- rebase on top of v5.10-rc2 +- provide /boot/symvers-kernelver.gz even no kabichk +- fix warning on uninstall kernel rpm + +* Sat Oct 31 2020 Xie XiuQi - 5.10.0-rc1.0.0.2 +- enable access to .config through /proc/config.gz + +* Tue Oct 27 2020 Xie XiuQi - 5.10.0-rc1.0.0.1 +- package init based on upstream v5.10-rc1 -- Gitee