linux/arch/powerpc/kexec
Aboorva Devarajan 5c86f1c1f9 powerpc/kexec: fix double get_cpu() imbalance in kexec_prepare_cpus
kexec_prepare_cpus_wait() calls get_cpu() internally to obtain the
current CPU id. kexec_prepare_cpus() calls kexec_prepare_cpus_wait()
twice -- once for KEXEC_STATE_IRQS_OFF and once for
KEXEC_STATE_REAL_MODE -- but only issues a single put_cpu() at the end,
leaving preempt_count elevated by one extra nesting level.

In practice the imbalance does not trigger a 'scheduling while atomic'
splat because the kexec path is a one-way trip: IRQs are already
disabled, no schedule() occurs after the leak, and
default_machine_kexec() overwrites preempt_count with HARDIRQ_OFFSET
before jumping into kexec_sequence() which never returns. However the
bookkeeping is still wrong.

kexec_prepare_cpus() calls local_irq_disable()/hard_irq_disable()
before invoking kexec_prepare_cpus_wait(), so the CPU is already pinned
and the get_cpu()/put_cpu() preempt_disable() bracketing is unnecessary.
Only the current CPU id is needed, so replace get_cpu() with
raw_smp_processor_id() and drop the now-unneeded put_cpu().

Fixes: 1fc711f7ff ("powerpc/kexec: Fix race in kexec shutdown")
Signed-off-by: Aboorva Devarajan <aboorvad@linux.ibm.com>
Reviewed-by: Shrikanth Hegde <sshegde@linux.ibm.com>
Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/20260605082912.305100-4-aboorvad@linux.ibm.com
2026-06-15 16:25:21 +05:30
..
core_32.c kexec: Consolidate machine_kexec_mask_interrupts() implementation 2024-12-11 20:32:34 +01:00
core_64.c powerpc/kexec: fix double get_cpu() imbalance in kexec_prepare_cpus 2026-06-15 16:25:21 +05:30
core.c powerpc/kexec/core: use big-endian types for crash variables 2026-03-04 11:08:57 +05:30
crash.c powerpc/crash: Update backup region offset in elfcorehdr on memory hotplug 2026-04-01 09:21:04 +05:30
elf_64.c arm64,ppc64le/kdump: pass dm-crypt keys to kdump kernel 2026-04-02 23:36:24 -07:00
file_load_64.c powerpc/crash: Update backup region offset in elfcorehdr on memory hotplug 2026-04-01 09:21:04 +05:30
file_load.c powerpc: Delete unused function delete_fdt_mem_rsv() 2021-03-08 12:06:30 -07:00
Makefile powerpc/kdump: fix KASAN sanitization flag for core_$(BITS).o 2026-05-06 07:31:27 +05:30
ranges.c powerpc/kdump: Fix size calculation for hot-removed memory ranges 2025-11-11 14:11:55 +05:30
relocate_32.S powerpc/kexec: fix physical address calculation in clear_utlb_entry() 2025-03-10 10:10:55 +05:30
vmcore_info.c arch, crash: move arch_crash_save_vmcoreinfo() out to file vmcore_info.c 2024-02-23 17:48:25 -08:00