]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
powerpc/64s/hash: Restrict stress_hpt_struct memblock region to within RMA limit
authorRitesh Harjani (IBM) <ritesh.list@gmail.com>
Thu, 30 Oct 2025 14:57:27 +0000 (20:27 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Dec 2025 12:55:00 +0000 (13:55 +0100)
[ Upstream commit 17b45ccf09882e0c808ad2cf62acdc90ad968746 ]

When HV=0 & IR/DR=0, the Hash MMU is said to be in Virtual Real
Addressing Mode during early boot. During this, we should ensure that
memory region allocations for stress_hpt_struct should happen from
within RMA region as otherwise the boot might get stuck while doing
memset of this region.

History behind why do we have RMA region limitation is better explained
in these 2 patches [1] & [2]. This patch ensures that memset to
stress_hpt_struct during early boot does not cross ppc64_rma_size
boundary.

[1]: https://lore.kernel.org/all/20190710052018.14628-1-sjitindarsingh@gmail.com/
[2]: https://lore.kernel.org/all/87wp54usvj.fsf@linux.vnet.ibm.com/

Fixes: 6b34a099faa12 ("powerpc/64s/hash: add stress_hpt kernel boot option to increase hash faults")
Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/ada1173933ea7617a994d6ee3e54ced8797339fc.1761834163.git.ritesh.list@gmail.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/powerpc/mm/book3s64/hash_utils.c

index e1eadd03f133909475137925a1f78d7cbc34a483..9914d89f9db7d47e42fe8f6d33eb8cb0d23c1267 100644 (file)
@@ -1039,11 +1039,14 @@ static void __init htab_initialize(void)
        unsigned long table;
        unsigned long pteg_count;
        unsigned long prot;
-       phys_addr_t base = 0, size = 0, end;
+       phys_addr_t base = 0, size = 0, end, limit = MEMBLOCK_ALLOC_ANYWHERE;
        u64 i;
 
        DBG(" -> htab_initialize()\n");
 
+       if (firmware_has_feature(FW_FEATURE_LPAR))
+               limit = ppc64_rma_size;
+
        if (mmu_has_feature(MMU_FTR_1T_SEGMENT)) {
                mmu_kernel_ssize = MMU_SEGSIZE_1T;
                mmu_highuser_ssize = MMU_SEGSIZE_1T;
@@ -1059,7 +1062,7 @@ static void __init htab_initialize(void)
                // Too early to use nr_cpu_ids, so use NR_CPUS
                tmp = memblock_phys_alloc_range(sizeof(struct stress_hpt_struct) * NR_CPUS,
                                                __alignof__(struct stress_hpt_struct),
-                                               0, MEMBLOCK_ALLOC_ANYWHERE);
+                                               MEMBLOCK_LOW_LIMIT, limit);
                memset((void *)tmp, 0xff, sizeof(struct stress_hpt_struct) * NR_CPUS);
                stress_hpt_struct = __va(tmp);
 
@@ -1093,7 +1096,6 @@ static void __init htab_initialize(void)
                        mmu_hash_ops.hpte_clear_all();
 #endif
        } else {
-               unsigned long limit = MEMBLOCK_ALLOC_ANYWHERE;
 
 #ifdef CONFIG_PPC_CELL
                /*
@@ -1109,7 +1111,7 @@ static void __init htab_initialize(void)
 
                table = memblock_phys_alloc_range(htab_size_bytes,
                                                  htab_size_bytes,
-                                                 0, limit);
+                                                 MEMBLOCK_LOW_LIMIT, limit);
                if (!table)
                        panic("ERROR: Failed to allocate %pa bytes below %pa\n",
                              &htab_size_bytes, &limit);