[v3 PATCH 2/9] mm: Introduce migrate target nodemask

From: Yang Shi
Date: Thu Jun 13 2019 - 19:34:54 EST


With more memory types are invented, the system may have heterogeneous
memory hierarchy, i.e. DRAM and PMEM. Some of them are cheaper and
slower than DRAM, may be good candidates to be used as secondary memory
to store not recently or frequently used data.

Introduce the "migrate target" nodemask for such memory nodes. The
migrate target could be any memory types which are cheaper and/or
slower than DRAM. Currently PMEM is one of such memory.

Signed-off-by: Yang Shi <yang.shi@xxxxxxxxxxxxxxxxx>
---
drivers/acpi/numa.c | 12 ++++++++++++
drivers/base/node.c | 2 ++
include/linux/nodemask.h | 1 +
mm/page_alloc.c | 1 +
4 files changed, 16 insertions(+)

diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c
index 3099583..f75adba 100644
--- a/drivers/acpi/numa.c
+++ b/drivers/acpi/numa.c
@@ -296,6 +296,18 @@ void __init acpi_numa_slit_init(struct acpi_table_slit *slit)
goto out_err_bad_srat;
}

+ /*
+ * The system may have memory hierarchy, some memory may be good
+ * candidate for migration target, i.e. PMEM is one of them. Mark
+ * such memory as migration target.
+ *
+ * It may be better to retrieve such information from HMAT, but
+ * SRAT sounds good enough for now. May switch to HMAT in the
+ * future.
+ */
+ if (ma->flags & ACPI_SRAT_MEM_NON_VOLATILE)
+ node_set_state(node, N_MIGRATE_TARGET);
+
node_set(node, numa_nodes_parsed);

pr_info("SRAT: Node %u PXM %u [mem %#010Lx-%#010Lx]%s%s\n",
diff --git a/drivers/base/node.c b/drivers/base/node.c
index 4d80fc8..351b694 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -985,6 +985,7 @@ static ssize_t show_node_state(struct device *dev,
[N_MEMORY] = _NODE_ATTR(has_memory, N_MEMORY),
[N_CPU] = _NODE_ATTR(has_cpu, N_CPU),
[N_CPU_MEM] = _NODE_ATTR(primary, N_CPU_MEM),
+ [N_MIGRATE_TARGET] = _NODE_ATTR(migrate_target, N_MIGRATE_TARGET),
};

static struct attribute *node_state_attrs[] = {
@@ -997,6 +998,7 @@ static ssize_t show_node_state(struct device *dev,
&node_state_attr[N_MEMORY].attr.attr,
&node_state_attr[N_CPU].attr.attr,
&node_state_attr[N_CPU_MEM].attr.attr,
+ &node_state_attr[N_MIGRATE_TARGET].attr.attr,
NULL
};

diff --git a/include/linux/nodemask.h b/include/linux/nodemask.h
index 66a8964..411618c 100644
--- a/include/linux/nodemask.h
+++ b/include/linux/nodemask.h
@@ -400,6 +400,7 @@ enum node_states {
N_MEMORY, /* The node has memory(regular, high, movable) */
N_CPU, /* The node has one or more cpus */
N_CPU_MEM, /* The node has both cpus and memory */
+ N_MIGRATE_TARGET, /* The node is suitable migrate target */
NR_NODE_STATES
};

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 757db89e..3b37c71 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -125,6 +125,7 @@ struct pcpu_drain {
[N_MEMORY] = { { [0] = 1UL } },
[N_CPU] = { { [0] = 1UL } },
[N_CPU_MEM] = { { [0] = 1UL } },
+ [N_MIGRATE_TARGET] = { { [0] = 1UL } },
#endif /* NUMA */
};
EXPORT_SYMBOL(node_states);
--
1.8.3.1