On Thu, Aug 10, 2017 at 02:53:48PM +0530, Bharata B Rao wrote:
diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c
index f830562..24ecf53 100644
--- a/arch/powerpc/kernel/prom.c
+++ b/arch/powerpc/kernel/prom.c
@@ -524,6 +524,7 @@ static int __init early_init_dt_scan_drconf_memory(unsigned 
long node)
                                        size = 0x80000000ul - base;
                        }
                        memblock_add(base, size);
+                       memblock_mark_hotplug(base, size);
                } while (--rngs);
        }
        memblock_dump_all();

Doing this has the effect of putting all the affected memory into ZONE_MOVABLE. See find_zone_movable_pfns_for_nodes(). This means no kernel allocations can occur there. Is that okay?

diff --git a/arch/powerpc/mm/pgtable-radix.c b/arch/powerpc/mm/pgtable-radix.c
index 671a45d..180d25a 100644
--- a/arch/powerpc/mm/pgtable-radix.c
+++ b/arch/powerpc/mm/pgtable-radix.c
@@ -12,6 +12,7 @@
#include <linux/memblock.h>
#include <linux/of_fdt.h>
#include <linux/mm.h>
+#include <linux/memory.h>

#include <asm/pgtable.h>
#include <asm/pgalloc.h>
@@ -255,15 +256,25 @@ static void __init radix_init_pgtable(void)
{
        unsigned long rts_field;
        struct memblock_region *reg;
+       phys_addr_t addr;
+       u64 lmb_size = memory_block_size_bytes();

        /* We don't support slb for radix */
        mmu_slb_size = 0;
        /*
         * Create the linear mapping, using standard page size for now
         */
-       for_each_memblock(memory, reg)
-               WARN_ON(create_physical_mapping(reg->base,
-                                               reg->base + reg->size));
+       for_each_memblock(memory, reg) {
+               if (memblock_is_hotpluggable(reg)) {
+                       for (addr = reg->base; addr < (reg->base + reg->size);
+                               addr += lmb_size)
+                               WARN_ON(create_physical_mapping(addr,
+                                       addr + lmb_size));
+               } else {
+                       WARN_ON(create_physical_mapping(reg->base,
+                                                       reg->base + reg->size));
+               }
+       }

        /* Find out how many PID bits are supported */
        if (cpu_has_feature(CPU_FTR_HVMODE)) {
--
2.7.4


--
Reza Arbab

Reply via email to