From: Greg Kroah-Hartman Date: Fri, 10 Mar 2023 13:06:12 +0000 (+0100) Subject: 6.2-stable patches X-Git-Tag: v6.1.17~12 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dbc669aab787310228d958300dbebf674f9f6c6f;p=thirdparty%2Fkernel%2Fstable-queue.git 6.2-stable patches added patches: arm64-efi-make-efi_rt_lock-a-raw_spinlock.patch --- diff --git a/queue-6.2/arm64-efi-make-efi_rt_lock-a-raw_spinlock.patch b/queue-6.2/arm64-efi-make-efi_rt_lock-a-raw_spinlock.patch new file mode 100644 index 00000000000..f8d710d28fa --- /dev/null +++ b/queue-6.2/arm64-efi-make-efi_rt_lock-a-raw_spinlock.patch @@ -0,0 +1,97 @@ +From 0e68b5517d3767562889f1d83fdb828c26adb24f Mon Sep 17 00:00:00 2001 +From: Pierre Gondois +Date: Wed, 15 Feb 2023 17:10:47 +0100 +Subject: arm64: efi: Make efi_rt_lock a raw_spinlock + +From: Pierre Gondois + +commit 0e68b5517d3767562889f1d83fdb828c26adb24f upstream. + +Running a rt-kernel base on 6.2.0-rc3-rt1 on an Ampere Altra outputs +the following: + BUG: sleeping function called from invalid context at kernel/locking/spinlock_rt.c:46 + in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 9, name: kworker/u320:0 + preempt_count: 2, expected: 0 + RCU nest depth: 0, expected: 0 + 3 locks held by kworker/u320:0/9: + #0: ffff3fff8c27d128 ((wq_completion)efi_rts_wq){+.+.}-{0:0}, at: process_one_work (./include/linux/atomic/atomic-long.h:41) + #1: ffff80000861bdd0 ((work_completion)(&efi_rts_work.work)){+.+.}-{0:0}, at: process_one_work (./include/linux/atomic/atomic-long.h:41) + #2: ffffdf7e1ed3e460 (efi_rt_lock){+.+.}-{3:3}, at: efi_call_rts (drivers/firmware/efi/runtime-wrappers.c:101) + Preemption disabled at: + efi_virtmap_load (./arch/arm64/include/asm/mmu_context.h:248) + CPU: 0 PID: 9 Comm: kworker/u320:0 Tainted: G W 6.2.0-rc3-rt1 + Hardware name: WIWYNN Mt.Jade Server System B81.03001.0005/Mt.Jade Motherboard, BIOS 1.08.20220218 (SCP: 1.08.20220218) 2022/02/18 + Workqueue: efi_rts_wq efi_call_rts + Call trace: + dump_backtrace (arch/arm64/kernel/stacktrace.c:158) + show_stack (arch/arm64/kernel/stacktrace.c:165) + dump_stack_lvl (lib/dump_stack.c:107 (discriminator 4)) + dump_stack (lib/dump_stack.c:114) + __might_resched (kernel/sched/core.c:10134) + rt_spin_lock (kernel/locking/rtmutex.c:1769 (discriminator 4)) + efi_call_rts (drivers/firmware/efi/runtime-wrappers.c:101) + [...] + +This seems to come from commit ff7a167961d1 ("arm64: efi: Execute +runtime services from a dedicated stack") which adds a spinlock. This +spinlock is taken through: +efi_call_rts() +\-efi_call_virt() + \-efi_call_virt_pointer() + \-arch_efi_call_virt_setup() + +Make 'efi_rt_lock' a raw_spinlock to avoid being preempted. + +[ardb: The EFI runtime services are called with a different set of + translation tables, and are permitted to use the SIMD registers. + The context switch code preserves/restores neither, and so EFI + calls must be made with preemption disabled, rather than only + disabling migration.] + +Fixes: ff7a167961d1 ("arm64: efi: Execute runtime services from a dedicated stack") +Signed-off-by: Pierre Gondois +Cc: # v6.1+ +Signed-off-by: Ard Biesheuvel +Signed-off-by: Greg Kroah-Hartman +--- + arch/arm64/include/asm/efi.h | 6 +++--- + arch/arm64/kernel/efi.c | 2 +- + 2 files changed, 4 insertions(+), 4 deletions(-) + +--- a/arch/arm64/include/asm/efi.h ++++ b/arch/arm64/include/asm/efi.h +@@ -33,7 +33,7 @@ int efi_set_mapping_permissions(struct m + ({ \ + efi_virtmap_load(); \ + __efi_fpsimd_begin(); \ +- spin_lock(&efi_rt_lock); \ ++ raw_spin_lock(&efi_rt_lock); \ + }) + + #undef arch_efi_call_virt +@@ -42,12 +42,12 @@ int efi_set_mapping_permissions(struct m + + #define arch_efi_call_virt_teardown() \ + ({ \ +- spin_unlock(&efi_rt_lock); \ ++ raw_spin_unlock(&efi_rt_lock); \ + __efi_fpsimd_end(); \ + efi_virtmap_unload(); \ + }) + +-extern spinlock_t efi_rt_lock; ++extern raw_spinlock_t efi_rt_lock; + extern u64 *efi_rt_stack_top; + efi_status_t __efi_rt_asm_wrapper(void *, const char *, ...); + +--- a/arch/arm64/kernel/efi.c ++++ b/arch/arm64/kernel/efi.c +@@ -146,7 +146,7 @@ asmlinkage efi_status_t efi_handle_corru + return s; + } + +-DEFINE_SPINLOCK(efi_rt_lock); ++DEFINE_RAW_SPINLOCK(efi_rt_lock); + + asmlinkage u64 *efi_rt_stack_top __ro_after_init; + diff --git a/queue-6.2/series b/queue-6.2/series index 1914dd51a5e..51314966e2a 100644 --- a/queue-6.2/series +++ b/queue-6.2/series @@ -207,3 +207,4 @@ drm-display-dp_mst-handle-old-new-payload-states-in-drm_dp_remove_payload.patch drm-i915-dp_mst-fix-payload-removal-during-output-disabling.patch drm-i915-fix-system-suspend-without-fbdev-being-initialized.patch media-uvcvideo-fix-race-condition-with-usb_kill_urb.patch +arm64-efi-make-efi_rt_lock-a-raw_spinlock.patch