Message ID | 20210812065907.20046-1-rppt@kernel.org (mailing list archive) |
---|---|
Headers | show |
Series | memblock: make memblock_find_in_range method private | expand |
Mike, On Thu, Aug 12, 2021 at 09:59:05AM +0300, Mike Rapoport wrote: > From: Mike Rapoport <rppt@linux.ibm.com> > > Hi, > > This is v4 of "memblock: make memblock_find_in_range method private" patch > that essentially replaces memblock_find_in_range() + memblock_reserve() > calls with equivalent calls to memblock_phys_alloc() and prevents usage of > memblock_find_in_range() outside memblock itself. > > The patch uncovered an issue with top down memory mapping on x86 and this > version has a preparation patch that addresses this issue. > > Guenter, I didn't add your Tested-by because the patch that addresses the > crashes differs from the one you've tested. > Unfortunately I am still seeing crashes. 1G of memory, x86_64: [ 0.000000] efi: EFI v2.70 by EDK II [ 0.000000] efi: SMBIOS=0x3fbcc000 ACPI=0x3fbfa000 ACPI 2.0=0x3fbfa014 MEMATTR=0x3f229018 [ 0.000000] SMBIOS 2.8 present. [ 0.000000] DMI: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015 [ 0.000000] tsc: Fast TSC calibration using PIT [ 0.000000] tsc: Detected 3792.807 MHz processor [ 0.001816] last_pfn = 0x3ff50 max_arch_pfn = 0x400000000 [ 0.002595] x86/PAT: Configuration [0-7]: WB WC UC- UC WB WP UC- WT [ 0.022989] Using GB pages for direct mapping [ 0.025601] Kernel panic - not syncing: alloc_low_pages: can not alloc memory [ 0.025910] CPU: 0 PID: 0 Comm: swapper Not tainted 5.14.0-rc5+ #1 [ 0.026133] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015 [ 0.026462] Call Trace: [ 0.026942] ? dump_stack_lvl+0x57/0x7d [ 0.027475] ? panic+0x10a/0x2de [ 0.027600] ? alloc_low_pages+0x117/0x156 [ 0.027704] ? phys_pmd_init+0x234/0x342 [ 0.027817] ? phys_pud_init+0x171/0x337 [ 0.027926] ? __kernel_physical_mapping_init+0xec/0x276 [ 0.028062] ? init_memory_mapping+0x1ea/0x2ca [ 0.028199] ? init_range_memory_mapping+0xdf/0x12e [ 0.028326] ? init_mem_mapping+0x1e9/0x261 [ 0.028432] ? setup_arch+0x5ff/0xb6d [ 0.028535] ? start_kernel+0x71/0x6b4 [ 0.028636] ? secondary_startup_64_no_verify+0xc2/0xcb [ 0.029479] ---[ end Kernel panic - not syncing: alloc_low_pages: can not alloc memory ]--- Complete log: https://kerneltests.org/builders/qemu-x86_64-testing/builds/67/steps/qemubuildcommand/logs/stdio x86, default memory size, all efi boots affected: [ 0.025676] BUG: unable to handle page fault for address: cf3c1000 [ 0.025932] #PF: supervisor write access in kernel mode [ 0.026022] #PF: error_code(0x0002) - not-present page [ 0.026122] *pde = 00000000 [ 0.026308] Oops: 0002 [#1] SMP [ 0.026468] CPU: 0 PID: 0 Comm: swapper Not tainted 5.14.0-rc5+ #1 [ 0.026616] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015 [ 0.026848] EIP: alloc_low_pages+0xa0/0x13f [ 0.027355] Code: 00 74 77 a3 cc ba 62 ca 8b 45 f0 8d 90 00 00 0c 00 31 c0 c1 e2 0c 85 f6 74 16 89 d7 b9 00 04 00 00 83 c3 01 81 c2 00 10 00 00 <f3> ab 39 f3 75 ea 8b 45 f0 8d 65 f4 5b 5e c1 e0 0c 5f 5d 2d 00 00 [ 0.027802] EAX: 00000000 EBX: 00000001 ECX: 00000400 EDX: cf3c2000 [ 0.027903] ESI: 00000001 EDI: cf3c1000 EBP: ca389e28 ESP: ca389e18 [ 0.028006] DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068 EFLAGS: 00200086 [ 0.028125] CR0: 80050033 CR2: cf3c1000 CR3: 0a69f000 CR4: 00040690 [ 0.028287] Call Trace: [ 0.028603] one_page_table_init+0x15/0x6d [ 0.028751] kernel_physical_mapping_init+0xdd/0x19b [ 0.028839] init_memory_mapping+0x146/0x1f1 [ 0.028921] init_range_memory_mapping+0xfe/0x144 [ 0.029001] init_mem_mapping+0x145/0x185 [ 0.029066] setup_arch+0x5ff/0xa75 [ 0.029128] ? vprintk+0x4c/0x100 [ 0.029187] start_kernel+0x66/0x5ba [ 0.029246] ? set_intr_gate+0x42/0x55 [ 0.029306] ? early_idt_handler_common+0x44/0x44 [ 0.029380] i386_start_kernel+0x43/0x45 [ 0.029441] startup_32_smp+0x161/0x164 [ 0.029567] Modules linked in: [ 0.029776] CR2: 00000000cf3c1000 [ 0.030406] random: get_random_bytes called from oops_exit+0x35/0x60 with crng_init=0 [ 0.031121] ---[ end trace 544692cd05e387e2 ]--- [ 0.031357] EIP: alloc_low_pages+0xa0/0x13f [ 0.031427] Code: 00 74 77 a3 cc ba 62 ca 8b 45 f0 8d 90 00 00 0c 00 31 c0 c1 e2 0c 85 f6 74 16 89 d7 b9 00 04 00 00 83 c3 01 81 c2 00 10 00 00 <f3> ab 39 f3 75 ea 8b 45 f0 8d 65 f4 5b 5e c1 e0 0c 5f 5d 2d 00 00 [ 0.031698] EAX: 00000000 EBX: 00000001 ECX: 00000400 EDX: cf3c2000 [ 0.031787] ESI: 00000001 EDI: cf3c1000 EBP: ca389e28 ESP: ca389e18 [ 0.031876] DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068 EFLAGS: 00200086 [ 0.031972] CR0: 80050033 CR2: cf3c1000 CR3: 0a69f000 CR4: 00040690 [ 0.032198] Kernel panic - not syncing: Attempted to kill the idle task! [ 0.032521] ---[ end Kernel panic - not syncing: Attempted to kill the idle task! ]-- Complete log: https://kerneltests.org/builders/qemu-x86-testing/builds/65/steps/qemubuildcommand/logs/stdio Guenter
From: Mike Rapoport <rppt@linux.ibm.com> Hi, This is v4 of "memblock: make memblock_find_in_range method private" patch that essentially replaces memblock_find_in_range() + memblock_reserve() calls with equivalent calls to memblock_phys_alloc() and prevents usage of memblock_find_in_range() outside memblock itself. The patch uncovered an issue with top down memory mapping on x86 and this version has a preparation patch that addresses this issue. Guenter, I didn't add your Tested-by because the patch that addresses the crashes differs from the one you've tested. v4: * Add patch that prevents the crashes reported by Guenter Roeck on x86/i386 on QEMU with 256M or 512M of memory and EFI boot enabled. * Add Acked-by and Reviewed-by, thanks everybidy! v3: https://lore.kernel.org/lkml/20210803064218.6611-1-rppt@kernel.org * simplify check for exact crash kerenl allocation on arm, per Rob * make crash_max unsigned long long on arm64, per Rob v2: https://lore.kernel.org/lkml/20210802063737.22733-1-rppt@kernel.org * don't change error message in arm::reserve_crashkernel(), per Russell v1: https://lore.kernel.org/lkml/20210730104039.7047-1-rppt@kernel.org Mike Rapoport (2): x86/mm: memory_map_top_down: remove spurious reservation of upper 2M memblock: make memblock_find_in_range method private arch/arm/kernel/setup.c | 20 +++++--------- arch/arm64/kvm/hyp/reserved_mem.c | 9 +++---- arch/arm64/mm/init.c | 36 ++++++++----------------- arch/mips/kernel/setup.c | 14 +++++----- arch/riscv/mm/init.c | 44 ++++++++++--------------------- arch/s390/kernel/setup.c | 10 ++++--- arch/x86/kernel/aperture_64.c | 5 ++-- arch/x86/mm/init.c | 27 +++++++------------ arch/x86/mm/numa.c | 5 ++-- arch/x86/mm/numa_emulation.c | 5 ++-- arch/x86/realmode/init.c | 2 +- drivers/acpi/tables.c | 5 ++-- drivers/base/arch_numa.c | 5 +--- drivers/of/of_reserved_mem.c | 12 ++++++--- include/linux/memblock.h | 2 -- mm/memblock.c | 2 +- 16 files changed, 76 insertions(+), 127 deletions(-) base-commit: ff1176468d368232b684f75e82563369208bc371