aarch64: IRQ exit blocks on PROCESS_MANAGER under an unmasked try_manager() holder
Lock: PROCESS_MANAGER (kernel/src/process/mod.rs:146)
Arch: aarch64
Chain:
kernel/src/arch_impl/aarch64/boot.S:699 bl check_need_resched_and_switch_arm64 ->
kernel/src/arch_impl/aarch64/context_switch.rs:5187 (first statement) ->
kernel/src/arch_impl/aarch64/context_switch.rs:5191 crate::task::process_task::drain_deferred_fault_sigsegv_exits() ->
kernel/src/task/process_task.rs:989 ProcessScheduler::handle_thread_exit(tid, -11) ->
kernel/src/task/process_task.rs:764 ->
kernel/src/process/mod.rs:772 blocking crate::process::manager()
Thread-side holders:
The 9 unmasked aarch64 try_manager() holders:
kernel/src/syscall/handlers.rs:3875 sys_fcntl
kernel/src/syscall/signal.rs:1839, :1859, :1902 sys_pause_with_frame_aarch64
kernel/src/syscall/signal.rs:2064 sys_sigreturn_with_frame_aarch64
kernel/src/syscall/signal.rs:2152, :2203, :2247 sys_sigsuspend_with_frame_aarch64
kernel/src/arch_impl/aarch64/syscall_entry.rs:218 check_and_deliver_signals_aarch64
Note: This is distinct from #812 because it sits above the PREEMPT_ACTIVE early return (kernel/src/arch_impl/aarch64/context_switch.rs:5201-5220) and above each from_el0 test, so neither the preempt state nor the interrupted EL gates it. A fix that gates aarch64 do_softirq on the whole preempt_count leaves this chain untouched, because this is not a softirq.
Not measured here. This is a code-path reachability argument with no reproduction.
Related: #812, IRQ-CONTEXT-LOCK-CENSUS-2026-09-05.md section 5.F2
aarch64: IRQ exit blocks on PROCESS_MANAGER under an unmasked try_manager() holder
Lock: PROCESS_MANAGER (kernel/src/process/mod.rs:146)
Arch: aarch64
Chain:
kernel/src/arch_impl/aarch64/boot.S:699
bl check_need_resched_and_switch_arm64->kernel/src/arch_impl/aarch64/context_switch.rs:5187 (first statement) ->
kernel/src/arch_impl/aarch64/context_switch.rs:5191
crate::task::process_task::drain_deferred_fault_sigsegv_exits()->kernel/src/task/process_task.rs:989
ProcessScheduler::handle_thread_exit(tid, -11)->kernel/src/task/process_task.rs:764 ->
kernel/src/process/mod.rs:772 blocking
crate::process::manager()Thread-side holders:
The 9 unmasked aarch64
try_manager()holders:kernel/src/syscall/handlers.rs:3875
sys_fcntlkernel/src/syscall/signal.rs:1839, :1859, :1902
sys_pause_with_frame_aarch64kernel/src/syscall/signal.rs:2064
sys_sigreturn_with_frame_aarch64kernel/src/syscall/signal.rs:2152, :2203, :2247
sys_sigsuspend_with_frame_aarch64kernel/src/arch_impl/aarch64/syscall_entry.rs:218
check_and_deliver_signals_aarch64Note: This is distinct from #812 because it sits above the PREEMPT_ACTIVE early return (kernel/src/arch_impl/aarch64/context_switch.rs:5201-5220) and above each
from_el0test, so neither the preempt state nor the interrupted EL gates it. A fix that gates aarch64do_softirqon the wholepreempt_countleaves this chain untouched, because this is not a softirq.Not measured here. This is a code-path reachability argument with no reproduction.
Related: #812, IRQ-CONTEXT-LOCK-CENSUS-2026-09-05.md section 5.F2