diff options
author | Linux Build Service Account <lnxbuild@quicinc.com> | 2017-11-28 03:16:29 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-11-28 03:16:28 -0800 |
commit | 24209a5db612e93b110894453dd17511f94071bf (patch) | |
tree | fa262f8469929a55b63321722648557f30372ae7 /arch | |
parent | 9f8441d7648ff39bde5f22f212cf953cf874672e (diff) | |
parent | 3b4fcdca6210904ba3a031af088e25ff3d26d918 (diff) |
Merge "defconfig: msm: enable memory hotplug support"
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm64/configs/msm-auto-perf_defconfig | 2 | ||||
-rw-r--r-- | arch/arm64/configs/msm-auto_defconfig | 2 | ||||
-rw-r--r-- | arch/arm64/mm/mmu.c | 15 |
3 files changed, 16 insertions, 3 deletions
diff --git a/arch/arm64/configs/msm-auto-perf_defconfig b/arch/arm64/configs/msm-auto-perf_defconfig index 7c61ed6bf6a4..059940742f1f 100644 --- a/arch/arm64/configs/msm-auto-perf_defconfig +++ b/arch/arm64/configs/msm-auto-perf_defconfig @@ -57,6 +57,8 @@ CONFIG_SCHED_MC=y CONFIG_NR_CPUS=8 CONFIG_PREEMPT=y CONFIG_HZ_100=y +CONFIG_MEMORY_HOTPLUG=y +CONFIG_MEMORY_HOTREMOVE=y CONFIG_CMA=y CONFIG_ZSMALLOC=y CONFIG_BALANCE_ANON_FILE_RECLAIM=y diff --git a/arch/arm64/configs/msm-auto_defconfig b/arch/arm64/configs/msm-auto_defconfig index 19a87cd7f5ed..bbad1af4a41c 100644 --- a/arch/arm64/configs/msm-auto_defconfig +++ b/arch/arm64/configs/msm-auto_defconfig @@ -54,6 +54,8 @@ CONFIG_SCHED_MC=y CONFIG_NR_CPUS=8 CONFIG_PREEMPT=y CONFIG_HZ_100=y +CONFIG_MEMORY_HOTPLUG=y +CONFIG_MEMORY_HOTREMOVE=y CONFIG_CMA=y CONFIG_CMA_DEBUGFS=y CONFIG_ZSMALLOC=y diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index 2b48e29ec30c..8c063d39bc17 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c @@ -1073,6 +1073,7 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node) pgd_t *pgd; pud_t *pud; pmd_t *pmd; + int ret = 0; do { next = pmd_addr_end(addr, end); @@ -1090,15 +1091,23 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node) void *p = NULL; p = vmemmap_alloc_block_buf(PMD_SIZE, node); - if (!p) - return -ENOMEM; + if (!p) { +#ifdef CONFIG_MEMORY_HOTPLUG + vmemmap_free(start, end); +#endif + ret = -ENOMEM; + break; + } set_pmd(pmd, __pmd(__pa(p) | PROT_SECT_NORMAL)); } else vmemmap_verify((pte_t *)pmd, node, addr, next); } while (addr = next, addr != end); - return 0; + if (ret) + return vmemmap_populate_basepages(start, end, node); + else + return ret; } #endif /* CONFIG_ARM64_64K_PAGES */ void vmemmap_free(unsigned long start, unsigned long end) |