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