@@ -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",
@@ -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
};
@@ -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
};
@@ -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);
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@linux.alibaba.com> --- 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(+)