kernel_samsung_a53x/arch/powerpc/kernel
Michael Ellerman fc6043a55e powerpc/mm: Fix boot crash with FLATMEM
[ Upstream commit daa9ada2093ed23d52b4c1fe6e13cf78f55cc85f ]

Erhard reported that his G5 was crashing with v6.6-rc kernels:

  mpic: Setting up HT PICs workarounds for U3/U4
  BUG: Unable to handle kernel data access at 0xfeffbb62ffec65fe
  Faulting instruction address: 0xc00000000005dc40
  Oops: Kernel access of bad area, sig: 11 [#1]
  BE PAGE_SIZE=4K MMU=Hash SMP NR_CPUS=2 PowerMac
  Modules linked in:
  CPU: 0 PID: 0 Comm: swapper/0 Tainted: G                T  6.6.0-rc3-PMacGS #1
  Hardware name: PowerMac11,2 PPC970MP 0x440101 PowerMac
  NIP:  c00000000005dc40 LR: c000000000066660 CTR: c000000000007730
  REGS: c0000000022bf510 TRAP: 0380   Tainted: G                T (6.6.0-rc3-PMacGS)
  MSR:  9000000000001032 <SF,HV,ME,IR,DR,RI>  CR: 44004242  XER: 00000000
  IRQMASK: 3
  GPR00: 0000000000000000 c0000000022bf7b0 c0000000010c0b00 00000000000001ac
  GPR04: 0000000003c80000 0000000000000300 c0000000f20001ae 0000000000000300
  GPR08: 0000000000000006 feffbb62ffec65ff 0000000000000001 0000000000000000
  GPR12: 9000000000001032 c000000002362000 c000000000f76b80 000000000349ecd8
  GPR16: 0000000002367ba8 0000000002367f08 0000000000000006 0000000000000000
  GPR20: 00000000000001ac c000000000f6f920 c0000000022cd985 000000000000000c
  GPR24: 0000000000000300 00000003b0a3691d c0003e008030000e 0000000000000000
  GPR28: c00000000000000c c0000000f20001ee feffbb62ffec65fe 00000000000001ac
  NIP hash_page_do_lazy_icache+0x50/0x100
  LR  __hash_page_4K+0x420/0x590
  Call Trace:
    hash_page_mm+0x364/0x6f0
    do_hash_fault+0x114/0x2b0
    data_access_common_virt+0x198/0x1f0
  --- interrupt: 300 at mpic_init+0x4bc/0x10c4
  NIP:  c000000002020a5c LR: c000000002020a04 CTR: 0000000000000000
  REGS: c0000000022bf9f0 TRAP: 0300   Tainted: G                T (6.6.0-rc3-PMacGS)
  MSR:  9000000000001032 <SF,HV,ME,IR,DR,RI>  CR: 24004248  XER: 00000000
  DAR: c0003e008030000e DSISR: 40000000 IRQMASK: 1
  ...
  NIP mpic_init+0x4bc/0x10c4
  LR  mpic_init+0x464/0x10c4
  --- interrupt: 300
    pmac_setup_one_mpic+0x258/0x2dc
    pmac_pic_init+0x28c/0x3d8
    init_IRQ+0x90/0x140
    start_kernel+0x57c/0x78c
    start_here_common+0x1c/0x20

A bisect pointed to the breakage beginning with commit 9fee28baa601 ("powerpc:
implement the new page table range API").

Analysis of the oops pointed to a struct page with a corrupted
compound_head being loaded via page_folio() -> _compound_head() in
hash_page_do_lazy_icache().

The access by the mpic code is to an MMIO address, so the expectation
is that the struct page for that address would be initialised by
init_unavailable_range(), as pointed out by Aneesh.

Instrumentation showed that was not the case, which eventually lead to
the realisation that pfn_valid() was returning false for that address,
causing the struct page to not be initialised.

Because the system is using FLATMEM, the version of pfn_valid() in
memory_model.h is used:

static inline int pfn_valid(unsigned long pfn)
{
	...
	return pfn >= pfn_offset && (pfn - pfn_offset) < max_mapnr;
}

Which relies on max_mapnr being initialised. Early in boot max_mapnr is
zero meaning no PFNs are valid.

max_mapnr is initialised in mem_init() called via:

  start_kernel()
    mm_core_init()  # init/main.c:928
      mem_init()

But that is too late for the usage in init_unavailable_range() called via:

  start_kernel()
    setup_arch()    # init/main.c:893
      paging_init()
        free_area_init()
          init_unavailable_range()

Although max_mapnr is currently set in mem_init(), the value is actually
already available much earlier, as soon as mem_topology_setup() has
completed, which is also before paging_init() is called. So move the
initialisation there, which causes paging_init() to correctly initialise
the struct page and fixes the bug.

This bug seems to have been lurking for years, but went unnoticed
because the pre-folio code was inspecting the uninitialised page->flags
but not dereferencing it.

Thanks to Erhard and Aneesh for help debugging.

Reported-by: Erhard Furtner <erhard_f@mailbox.org>
Closes: https://lore.kernel.org/all/20230929132750.3cd98452@yea/
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20231023112500.1550208-1-mpe@ellerman.id.au
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-11-18 10:58:47 +01:00
..
ptrace Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
syscalls Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
trace Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vdso32 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vdso64 Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
align.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
asm-offsets.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
audit.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
btext.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cacheinfo.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cacheinfo.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
compat_audit.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cpu_setup_6xx.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cpu_setup_44x.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cpu_setup_fsl_booke.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cpu_setup_pa6t.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cpu_setup_power.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cpu_setup_ppc970.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
cputable.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
crash_dump.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
dawr.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
dbell.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
dma-iommu.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
dma-mask.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
dma-swiotlb.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
dt_cpu_ftrs.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
early_32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
eeh.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
eeh_cache.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
eeh_driver.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
eeh_event.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
eeh_pe.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
eeh_sysfs.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
entry_32.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
entry_64.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
epapr_hcalls.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
epapr_paravirt.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
exceptions-64e.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
exceptions-64s.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
fadump.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
firmware.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
fpu.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
fsl_booke_entry_mapping.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_8xx.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_32.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_40x.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_44x.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_64.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_book3s_32.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_booke.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
head_fsl_booke.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
hw_breakpoint.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
hw_breakpoint_constraints.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
idle.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
idle_6xx.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
idle_book3e.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
idle_book3s.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
idle_e500.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ima_arch.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
io-workarounds.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
io.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
iomap.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
iommu.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
irq.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
isa-bridge.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
jump_label.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
kgdb.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
kprobes-ftrace.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
kprobes.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
kvm.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
kvm_emul.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
l2cr_6xx.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
legacy_serial.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Makefile Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mce.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mce_power.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
misc.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
misc_32.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
misc_64.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
module.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
module_32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
module_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
msi.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
note.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
nvram_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
of_platform.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
optprobes.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
optprobes_head.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
paca.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pci-common.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pci-hotplug.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pci_32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pci_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pci_dn.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pci_of_scan.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pmc.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ppc32.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ppc_save_regs.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
proc_powerpc.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
process.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
prom.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
prom_init.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
prom_init_check.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
prom_parse.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
reloc_32.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
reloc_64.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
rtas-proc.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
rtas-rtc.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
rtas.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
rtas_flash.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
rtas_pci.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
rtasd.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
secure_boot.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
security.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
secvar-ops.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
secvar-sysfs.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
setup-common.c powerpc/mm: Fix boot crash with FLATMEM 2024-11-18 10:58:47 +01:00
setup.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
setup_32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
setup_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
signal.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
signal.h Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
signal_32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
signal_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
smp-tbsync.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
smp.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
stacktrace.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
suspend.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
swsusp.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
swsusp_32.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
swsusp_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
swsusp_asm64.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
swsusp_booke.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sys_ppc32.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
syscall_64.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
syscalls.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sysfs.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
systbl.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
systbl_chk.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tau_6xx.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
time.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tm.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
traps.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ucall.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
udbg.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
udbg_16550.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
uprobes.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vdso.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vecemu.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vector.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vmlinux.lds.S Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
watchdog.c Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00