powerpc/64: pcpu setup avoid reading mmu_linear_psize on 64e or radix
authorNicholas Piggin <npiggin@gmail.com>
Wed, 1 Dec 2021 14:41:46 +0000 (00:41 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 2 Dec 2021 11:57:23 +0000 (22:57 +1100)
Radix never sets mmu_linear_psize so it's always 4K, which causes pcpu
atom_size to always be PAGE_SIZE. 64e sets it to 1GB always.

Make paths for these platforms to be explicit about what value they set
atom_size to.

Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20211201144153.2456614-12-npiggin@gmail.com
arch/powerpc/kernel/setup_64.c

index 6052f5d..9a49379 100644 (file)
@@ -880,14 +880,23 @@ void __init setup_per_cpu_areas(void)
        int rc = -EINVAL;
 
        /*
-        * Linear mapping is one of 4K, 1M and 16M.  For 4K, no need
-        * to group units.  For larger mappings, use 1M atom which
-        * should be large enough to contain a number of units.
+        * BookE and BookS radix are historical values and should be revisited.
         */
-       if (mmu_linear_psize == MMU_PAGE_4K)
+       if (IS_ENABLED(CONFIG_PPC_BOOK3E)) {
+               atom_size = SZ_1M;
+       } else if (radix_enabled()) {
                atom_size = PAGE_SIZE;
-       else
-               atom_size = 1 << 20;
+       } else {
+               /*
+                * Linear mapping is one of 4K, 1M and 16M.  For 4K, no need
+                * to group units.  For larger mappings, use 1M atom which
+                * should be large enough to contain a number of units.
+                */
+               if (mmu_linear_psize == MMU_PAGE_4K)
+                       atom_size = PAGE_SIZE;
+               else
+                       atom_size = SZ_1M;
+       }
 
        if (pcpu_chosen_fc != PCPU_FC_PAGE) {
                rc = pcpu_embed_first_chunk(0, dyn_size, atom_size, pcpu_cpu_distance,