diff options
Diffstat (limited to 'mm')
-rw-r--r-- | mm/memblock.c | 12 | ||||
-rw-r--r-- | mm/memory_hotplug.c | 1 |
2 files changed, 13 insertions, 0 deletions
diff --git a/mm/memblock.c b/mm/memblock.c index d5681008dce1..6a2a48a122a9 100644 --- a/mm/memblock.c +++ b/mm/memblock.c | |||
@@ -39,6 +39,9 @@ struct memblock memblock __initdata_memblock = { | |||
39 | }; | 39 | }; |
40 | 40 | ||
41 | int memblock_debug __initdata_memblock; | 41 | int memblock_debug __initdata_memblock; |
42 | #ifdef CONFIG_MOVABLE_NODE | ||
43 | bool movable_node_enabled __initdata_memblock = false; | ||
44 | #endif | ||
42 | static int memblock_can_resize __initdata_memblock; | 45 | static int memblock_can_resize __initdata_memblock; |
43 | static int memblock_memory_in_slab __initdata_memblock = 0; | 46 | static int memblock_memory_in_slab __initdata_memblock = 0; |
44 | static int memblock_reserved_in_slab __initdata_memblock = 0; | 47 | static int memblock_reserved_in_slab __initdata_memblock = 0; |
@@ -820,6 +823,11 @@ void __init_memblock __next_free_mem_range(u64 *idx, int nid, | |||
820 | * @out_nid: ptr to int for nid of the range, can be %NULL | 823 | * @out_nid: ptr to int for nid of the range, can be %NULL |
821 | * | 824 | * |
822 | * Reverse of __next_free_mem_range(). | 825 | * Reverse of __next_free_mem_range(). |
826 | * | ||
827 | * Linux kernel cannot migrate pages used by itself. Memory hotplug users won't | ||
828 | * be able to hot-remove hotpluggable memory used by the kernel. So this | ||
829 | * function skip hotpluggable regions if needed when allocating memory for the | ||
830 | * kernel. | ||
823 | */ | 831 | */ |
824 | void __init_memblock __next_free_mem_range_rev(u64 *idx, int nid, | 832 | void __init_memblock __next_free_mem_range_rev(u64 *idx, int nid, |
825 | phys_addr_t *out_start, | 833 | phys_addr_t *out_start, |
@@ -844,6 +852,10 @@ void __init_memblock __next_free_mem_range_rev(u64 *idx, int nid, | |||
844 | if (nid != MAX_NUMNODES && nid != memblock_get_region_node(m)) | 852 | if (nid != MAX_NUMNODES && nid != memblock_get_region_node(m)) |
845 | continue; | 853 | continue; |
846 | 854 | ||
855 | /* skip hotpluggable memory regions if needed */ | ||
856 | if (movable_node_is_enabled() && memblock_is_hotpluggable(m)) | ||
857 | continue; | ||
858 | |||
847 | /* scan areas before each reservation for intersection */ | 859 | /* scan areas before each reservation for intersection */ |
848 | for ( ; ri >= 0; ri--) { | 860 | for ( ; ri >= 0; ri--) { |
849 | struct memblock_region *r = &rsv->regions[ri]; | 861 | struct memblock_region *r = &rsv->regions[ri]; |
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 489f235502db..01e39afde1cb 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
@@ -1446,6 +1446,7 @@ static int __init cmdline_parse_movable_node(char *p) | |||
1446 | * the kernel away from hotpluggable memory. | 1446 | * the kernel away from hotpluggable memory. |
1447 | */ | 1447 | */ |
1448 | memblock_set_bottom_up(true); | 1448 | memblock_set_bottom_up(true); |
1449 | movable_node_enabled = true; | ||
1449 | #else | 1450 | #else |
1450 | pr_warn("movable_node option not supported\n"); | 1451 | pr_warn("movable_node option not supported\n"); |
1451 | #endif | 1452 | #endif |