|
@@ -31,6 +31,7 @@
|
|
|
#include <linux/firmware-map.h>
|
|
|
#include <linux/stop_machine.h>
|
|
|
#include <linux/hugetlb.h>
|
|
|
+#include <linux/memblock.h>
|
|
|
|
|
|
#include <asm/tlbflush.h>
|
|
|
|
|
@@ -1422,6 +1423,36 @@ static bool can_offline_normal(struct zone *zone, unsigned long nr_pages)
|
|
|
}
|
|
|
#endif /* CONFIG_MOVABLE_NODE */
|
|
|
|
|
|
+static int __init cmdline_parse_movable_node(char *p)
|
|
|
+{
|
|
|
+#ifdef CONFIG_MOVABLE_NODE
|
|
|
+ /*
|
|
|
+ * Memory used by the kernel cannot be hot-removed because Linux
|
|
|
+ * cannot migrate the kernel pages. When memory hotplug is
|
|
|
+ * enabled, we should prevent memblock from allocating memory
|
|
|
+ * for the kernel.
|
|
|
+ *
|
|
|
+ * ACPI SRAT records all hotpluggable memory ranges. But before
|
|
|
+ * SRAT is parsed, we don't know about it.
|
|
|
+ *
|
|
|
+ * The kernel image is loaded into memory at very early time. We
|
|
|
+ * cannot prevent this anyway. So on NUMA system, we set any
|
|
|
+ * node the kernel resides in as un-hotpluggable.
|
|
|
+ *
|
|
|
+ * Since on modern servers, one node could have double-digit
|
|
|
+ * gigabytes memory, we can assume the memory around the kernel
|
|
|
+ * image is also un-hotpluggable. So before SRAT is parsed, just
|
|
|
+ * allocate memory near the kernel image to try the best to keep
|
|
|
+ * the kernel away from hotpluggable memory.
|
|
|
+ */
|
|
|
+ memblock_set_bottom_up(true);
|
|
|
+#else
|
|
|
+ pr_warn("movable_node option not supported\n");
|
|
|
+#endif
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+early_param("movable_node", cmdline_parse_movable_node);
|
|
|
+
|
|
|
/* check which state of node_states will be changed when offline memory */
|
|
|
static void node_states_check_changes_offline(unsigned long nr_pages,
|
|
|
struct zone *zone, struct memory_notify *arg)
|