libnvdimm, e820: fix numa node for e820-type-12 pmem ranges
authorDan Williams <dan.j.williams@intel.com>
Thu, 12 Nov 2015 00:46:33 +0000 (16:46 -0800)
committerDan Williams <dan.j.williams@intel.com>
Thu, 12 Nov 2015 17:21:18 +0000 (09:21 -0800)
Rather than punt on the numa node for these e820 ranges try to find a
better answer with memory_add_physaddr_to_nid() when it is available.

Cc: <stable@vger.kernel.org>
Reported-by: Boaz Harrosh <boaz@plexistor.com>
Tested-by: Boaz Harrosh <boaz@plexistor.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/nvdimm/e820.c

index 8282db2ef99ea02077ef5609b85acfe0a8aae823..b0045a505dc88c9ef56dcc1094a198bd011d24a7 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (c) 2015, Intel Corporation.
  */
 #include <linux/platform_device.h>
+#include <linux/memory_hotplug.h>
 #include <linux/libnvdimm.h>
 #include <linux/module.h>
 
@@ -25,6 +26,18 @@ static int e820_pmem_remove(struct platform_device *pdev)
        return 0;
 }
 
+#ifdef CONFIG_MEMORY_HOTPLUG
+static int e820_range_to_nid(resource_size_t addr)
+{
+       return memory_add_physaddr_to_nid(addr);
+}
+#else
+static int e820_range_to_nid(resource_size_t addr)
+{
+       return NUMA_NO_NODE;
+}
+#endif
+
 static int e820_pmem_probe(struct platform_device *pdev)
 {
        static struct nvdimm_bus_descriptor nd_desc;
@@ -48,7 +61,7 @@ static int e820_pmem_probe(struct platform_device *pdev)
                memset(&ndr_desc, 0, sizeof(ndr_desc));
                ndr_desc.res = p;
                ndr_desc.attr_groups = e820_pmem_region_attribute_groups;
-               ndr_desc.numa_node = NUMA_NO_NODE;
+               ndr_desc.numa_node = e820_range_to_nid(p->start);
                set_bit(ND_REGION_PAGEMAP, &ndr_desc.flags);
                if (!nvdimm_pmem_region_create(nvdimm_bus, &ndr_desc))
                        goto err;