diff --git a/drivers/acpi/numa/srat.c b/drivers/acpi/numa/srat.c index 6021a101344222fc74bfc5d056061337e05f9646..1eff5ad56701f98ce31c7c29ff9afbd86d42c3cc 100644 --- a/drivers/acpi/numa/srat.c +++ b/drivers/acpi/numa/srat.c @@ -279,6 +279,9 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma) node_set(node, numa_nodes_parsed); + if (ma->flags & ACPI_SRAT_MEM_NON_VOLATILE) + set_node_pmem(node); + pr_info("SRAT: Node %u PXM %u [mem %#010Lx-%#010Lx]%s%s\n", node, pxm, (unsigned long long) start, (unsigned long long) end - 1, diff --git a/include/linux/numa.h b/include/linux/numa.h index cb44cfe2b7255a66722c09bfbd88d1b3714121ba..3539b8609f60766b72d34359b276708608acaee5 100644 --- a/include/linux/numa.h +++ b/include/linux/numa.h @@ -58,4 +58,7 @@ static inline int phys_to_target_node(u64 start) } #endif +void set_node_pmem(int nid); +int is_node_pmem(int nid); + #endif /* _LINUX_NUMA_H */ diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 91be63abbd7a3124d8ae056811e514633a4bad78..0cba3f02eb3c2980ceeb687b76c12b34437463b5 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -179,6 +179,8 @@ DEFINE_STATIC_KEY_FALSE(init_on_free); #endif EXPORT_SYMBOL(init_on_free); +nodemask_t numa_nodes_pmem; + static int __init early_init_on_alloc(char *buf) { int ret; @@ -8882,3 +8884,13 @@ bool take_page_off_buddy(struct page *page) return ret; } #endif + +void set_node_pmem(int nid) +{ + node_set(nid, numa_nodes_pmem); +} + +int is_node_pmem(int nid) +{ + return node_isset(nid, numa_nodes_pmem); +}