summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorMaciej Bielski <m.bielski@virtualopensystems.com>2017-04-28 14:14:14 +0530
committerArun KS <arunks@codeaurora.org>2017-11-22 08:11:50 +0530
commit9bade51dc7091483390dca012a6e14895b81253c (patch)
treee68f8d6f5e9d787b04437da7b3ad0d2d51c56548 /include
parenta1185dc1d20655de4b4c3dc32d96a376d3480d21 (diff)
arm64: Memory hotplug support for arm64 platform
This is a second and improved version of the patch previously released in [3]. It builds on the work by Scott Branden [2] and, henceforth, it needs to be applied on top of Scott's patches [2]. Comments are very welcome. Changes from the original patchset and known issues: - Compared to Scott's original patchset, this work adds the mapping of the new hotplugged pages into the kernel page tables. This is done by copying the old swapper_pg_dir over a new page, adding the new mappings, and then switching to the newly built pg_dir (see `hotplug_paging` in arch/arm64/mmu.c). There might be better ways to to this: suggestions are more than welcome. - The stub function for `arch_remove_memory` has been removed for now; we are working in parallel on memory hot remove, and we plan to contribute it as a separate patch. - Corresponding Kconfig flags have been added; - Note that this patch does not work when NUMA is enabled; in fact, the function `memory_add_physaddr_to_nid` does not have an implementation when the NUMA flag is on: this function is supposed to return the nid the hotplugged memory should be associated with. However it is not really clear to us yet what the semantics of this function in the context of a NUMA system should be. A quick and dirty fix would be to always attach to the first available NUMA node. - In arch/arm64/mm/init.c `arch_add_memory`, we are doing a hack with the nomap memory block flags to satisfy preconditions and postconditions of `__add_pages` and postconditions of `arch_add_memory`. Compared to memory hotplug implementation for other architectures, the "issue" seems to be in the implemenation of `pfn_valid`. Suggestions on how to cleanly avoid this hack are welcome. This patchset can be tested by starting the kernel with the `mem=X` flag, where X is less than the total available physical memory and has to be multiple of MIN_MEMORY_BLOCK_SIZE. We also tested it on a customised version of QEMU capable to emulate physical hotplug on arm64 platform. To enable the feature the CONFIG_MEMORY_HOTPLUG compilation flag needs to be set to true. Then, after memory is physically hotplugged, the standard two steps to make it available (as also documented in Documentation/memory-hotplug.txt) are: (1) Notify memory hot-add echo '0xYY000000' > /sys/devices/system/memory/probe where 0xYY000000 is the first physical address of the new memory section. (2) Online new memory block(s) echo online > /sys/devices/system/memory/memoryXXX/state -- or -- echo online_movable > /sys/devices/system/memory/memoryXXX/state where XXX corresponds to the ids of newly added blocks. Onlining can optionally be automatic at hot-add notification by enabling the global flag: echo online > /sys/devices/system/memory/auto_online_blocks or by setting the corresponding config flag in the kernel build. Again, any comment is highly appreciated. [1] https://lkml.org/lkml/2016/11/17/49 [2] https://lkml.org/lkml/2016/12/1/811 [3] https://lkml.org/lkml/2016/12/14/188 Change-Id: I545807e3121c159aaa2f917ea914ee98f38fb296 Signed-off-by: Maciej Bielski <m.bielski@virtualopensystems.com> Signed-off-by: Andrea Reale <ar@linux.vnet.ibm.com> Patch-mainline: linux-kernel @ 11 Apr 2017, 18:25 Signed-off-by: Srivatsa Vaddagiri <vatsa@codeaurora.org> [arunks@codeaurora.org: fix to pass checker test] Signed-off-by: Arun KS <arunks@codeaurora.org>
Diffstat (limited to 'include')
-rw-r--r--include/linux/memblock.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/memblock.h b/include/linux/memblock.h
index 2d79ec1496e5..d3f41bfe05f1 100644
--- a/include/linux/memblock.h
+++ b/include/linux/memblock.h
@@ -84,6 +84,7 @@ int memblock_mark_hotplug(phys_addr_t base, phys_addr_t size);
int memblock_clear_hotplug(phys_addr_t base, phys_addr_t size);
int memblock_mark_mirror(phys_addr_t base, phys_addr_t size);
int memblock_mark_nomap(phys_addr_t base, phys_addr_t size);
+int memblock_clear_nomap(phys_addr_t base, phys_addr_t size);
ulong choose_memblock_flags(void);
unsigned long memblock_region_resize_late_begin(void);
void memblock_region_resize_late_end(unsigned long);