With CONFIG_SPARSEMEM disabled the below kernel build error is observed.

 arch/powerpc/mm/init_64.c:477:38: error: use of undeclared identifier 
'SECTION_SIZE_BITS'

CONFIG_MEMORY_HOTPLUG depends on CONFIG_SPARSEMEM and it is more clear
to describe the code dependency in terms of MEMORY_HOTPLUG. Outside
memory hotplug the kernel uses memory_block_size for kernel directmap.
Instead of depending on SECTION_SIZE_BITS to compute the direct map
page size, add a new #define which defaults to 16M(same as existing
SECTION_SIZE)

Fixes: 4d15721177d5 ("powerpc/mm: Cleanup memory block size probing")
Signed-off-by: Aneesh Kumar K.V <aneesh.ku...@linux.ibm.com>
---
 arch/powerpc/mm/init_64.c | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c
index fcda46c2b8df..e3d7379ef480 100644
--- a/arch/powerpc/mm/init_64.c
+++ b/arch/powerpc/mm/init_64.c
@@ -472,12 +472,23 @@ static int __init dt_scan_mmu_pid_width(unsigned long 
node,
        return 1;
 }
 
+/*
+ * Outside hotplug the kernel uses this value to map the kernel direct map
+ * with radix. To be compatible with older kernels, let's keep this value
+ * as 16M which is also SECTION_SIZE with SPARSEMEM. We can ideally map
+ * things with 1GB size in the case where we don't support hotplug.
+ */
+#ifndef CONFIG_MEMORY_HOTPLUG
+#define DEFAULT_MEMORY_BLOCK_SIZE      SZ_16M
+#else
+#define DEFAULT_MEMORY_BLOCK_SIZE      MIN_MEMORY_BLOCK_SIZE
+#endif
+
 static void update_memory_block_size(unsigned long *block_size, unsigned long 
mem_size)
 {
-       unsigned long section_size = 1UL << SECTION_SIZE_BITS;
-
-       for (; *block_size > section_size; *block_size >>= 2) {
+       unsigned long min_memory_block_size = DEFAULT_MEMORY_BLOCK_SIZE;
 
+       for (; *block_size > min_memory_block_size; *block_size >>= 2) {
                if ((mem_size & *block_size) == 0)
                        break;
        }
@@ -507,7 +518,7 @@ static int __init probe_memory_block_size(unsigned long 
node, const char *uname,
                        /*
                         * Nothing in the device tree
                         */
-                       *block_size = MIN_MEMORY_BLOCK_SIZE;
+                       *block_size = DEFAULT_MEMORY_BLOCK_SIZE;
                else
                        *block_size = of_read_number(prop, dt_root_size_cells);
                /*
-- 
2.41.0

Reply via email to