ACPI: HMAT: refactor hmat_register_target_device to hmem_register_device
authorDan Williams <dan.j.williams@intel.com>
Tue, 13 Oct 2020 23:49:13 +0000 (16:49 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 14 Oct 2020 01:38:27 +0000 (18:38 -0700)
In preparation for exposing "Soft Reserved" memory ranges without an HMAT,
move the hmem device registration to its own compilation unit and make the
implementation generic.

The generic implementation drops usage acpi_map_pxm_to_online_node() that
was translating ACPI proximity domain values and instead relies on
numa_map_to_online_node() to determine the numa node for the device.

[joao.m.martins@oracle.com: CONFIG_DEV_DAX_HMEM_DEVICES should depend on CONFIG_DAX=y]
Link: https://lkml.kernel.org/r/8f34727f-ec2d-9395-cb18-969ec8a5d0d4@oracle.com
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Ben Skeggs <bskeggs@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brice Goglin <Brice.Goglin@inria.fr>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: Dave Jiang <dave.jiang@intel.com>
Cc: David Airlie <airlied@linux.ie>
Cc: David Hildenbrand <david@redhat.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Ira Weiny <ira.weiny@intel.com>
Cc: Jason Gunthorpe <jgg@mellanox.com>
Cc: Jeff Moyer <jmoyer@redhat.com>
Cc: Jia He <justin.he@arm.com>
Cc: Joao Martins <joao.m.martins@oracle.com>
Cc: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Mike Rapoport <rppt@linux.ibm.com>
Cc: Paul Mackerras <paulus@ozlabs.org>
Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Vishal Verma <vishal.l.verma@intel.com>
Cc: Wei Yang <richard.weiyang@linux.alibaba.com>
Cc: Will Deacon <will@kernel.org>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Hulk Robot <hulkci@huawei.com>
Cc: Jason Yan <yanaijie@huawei.com>
Cc: "Jérôme Glisse" <jglisse@redhat.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: kernel test robot <lkp@intel.com>
Cc: Randy Dunlap <rdunlap@infradead.org>
Cc: Stefano Stabellini <sstabellini@kernel.org>
Cc: Vivek Goyal <vgoyal@redhat.com>
Link: https://lkml.kernel.org/r/159643096584.4062302.5035370788475153738.stgit@dwillia2-desk3.amr.corp.intel.com
Link: https://lore.kernel.org/r/158318761484.2216124.2049322072599482736.stgit@dwillia2-desk3.amr.corp.intel.com
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/acpi/numa/hmat.c
drivers/dax/Kconfig
drivers/dax/Makefile
drivers/dax/hmem.c [deleted file]
drivers/dax/hmem/Makefile [new file with mode: 0644]
drivers/dax/hmem/device.c [new file with mode: 0644]
drivers/dax/hmem/hmem.c [new file with mode: 0644]
include/linux/dax.h

index a12e36a..134bcb4 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/mutex.h>
 #include <linux/node.h>
 #include <linux/sysfs.h>
+#include <linux/dax.h>
 
 static u8 hmat_revision;
 static int hmat_disable __initdata;
@@ -640,66 +641,6 @@ static void hmat_register_target_perf(struct memory_target *target)
        node_set_perf_attrs(mem_nid, &target->hmem_attrs, 0);
 }
 
-static void hmat_register_target_device(struct memory_target *target,
-               struct resource *r)
-{
-       /* define a clean / non-busy resource for the platform device */
-       struct resource res = {
-               .start = r->start,
-               .end = r->end,
-               .flags = IORESOURCE_MEM,
-       };
-       struct platform_device *pdev;
-       struct memregion_info info;
-       int rc, id;
-
-       rc = region_intersects(res.start, resource_size(&res), IORESOURCE_MEM,
-                       IORES_DESC_SOFT_RESERVED);
-       if (rc != REGION_INTERSECTS)
-               return;
-
-       id = memregion_alloc(GFP_KERNEL);
-       if (id < 0) {
-               pr_err("memregion allocation failure for %pr\n", &res);
-               return;
-       }
-
-       pdev = platform_device_alloc("hmem", id);
-       if (!pdev) {
-               pr_err("hmem device allocation failure for %pr\n", &res);
-               goto out_pdev;
-       }
-
-       pdev->dev.numa_node = acpi_map_pxm_to_online_node(target->memory_pxm);
-       info = (struct memregion_info) {
-               .target_node = acpi_map_pxm_to_node(target->memory_pxm),
-       };
-       rc = platform_device_add_data(pdev, &info, sizeof(info));
-       if (rc < 0) {
-               pr_err("hmem memregion_info allocation failure for %pr\n", &res);
-               goto out_pdev;
-       }
-
-       rc = platform_device_add_resources(pdev, &res, 1);
-       if (rc < 0) {
-               pr_err("hmem resource allocation failure for %pr\n", &res);
-               goto out_resource;
-       }
-
-       rc = platform_device_add(pdev);
-       if (rc < 0) {
-               dev_err(&pdev->dev, "device add failed for %pr\n", &res);
-               goto out_resource;
-       }
-
-       return;
-
-out_resource:
-       put_device(&pdev->dev);
-out_pdev:
-       memregion_free(id);
-}
-
 static void hmat_register_target_devices(struct memory_target *target)
 {
        struct resource *res;
@@ -711,8 +652,11 @@ static void hmat_register_target_devices(struct memory_target *target)
        if (!IS_ENABLED(CONFIG_DEV_DAX_HMEM))
                return;
 
-       for (res = target->memregions.child; res; res = res->sibling)
-               hmat_register_target_device(target, res);
+       for (res = target->memregions.child; res; res = res->sibling) {
+               int target_nid = acpi_map_pxm_to_node(target->memory_pxm);
+
+               hmem_register_device(target_nid, res);
+       }
 }
 
 static void hmat_register_target(struct memory_target *target)
index 3b6c06f..a66dff7 100644 (file)
@@ -48,6 +48,10 @@ config DEV_DAX_HMEM
 
          Say M if unsure.
 
+config DEV_DAX_HMEM_DEVICES
+       depends on DEV_DAX_HMEM && DAX=y
+       def_bool y
+
 config DEV_DAX_KMEM
        tristate "KMEM DAX: volatile-use of persistent memory"
        default DEV_DAX
index 80065b3..9d4ba67 100644 (file)
@@ -2,11 +2,10 @@
 obj-$(CONFIG_DAX) += dax.o
 obj-$(CONFIG_DEV_DAX) += device_dax.o
 obj-$(CONFIG_DEV_DAX_KMEM) += kmem.o
-obj-$(CONFIG_DEV_DAX_HMEM) += dax_hmem.o
 
 dax-y := super.o
 dax-y += bus.o
 device_dax-y := device.o
-dax_hmem-y := hmem.o
 
 obj-y += pmem/
+obj-y += hmem/
diff --git a/drivers/dax/hmem.c b/drivers/dax/hmem.c
deleted file mode 100644 (file)
index fe7214d..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-#include <linux/platform_device.h>
-#include <linux/memregion.h>
-#include <linux/module.h>
-#include <linux/pfn_t.h>
-#include "bus.h"
-
-static int dax_hmem_probe(struct platform_device *pdev)
-{
-       struct device *dev = &pdev->dev;
-       struct dev_pagemap pgmap = { };
-       struct dax_region *dax_region;
-       struct memregion_info *mri;
-       struct dev_dax *dev_dax;
-       struct resource *res;
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res)
-               return -ENOMEM;
-
-       mri = dev->platform_data;
-       memcpy(&pgmap.res, res, sizeof(*res));
-
-       dax_region = alloc_dax_region(dev, pdev->id, res, mri->target_node,
-                       PMD_SIZE, PFN_DEV|PFN_MAP);
-       if (!dax_region)
-               return -ENOMEM;
-
-       dev_dax = devm_create_dev_dax(dax_region, 0, &pgmap);
-       if (IS_ERR(dev_dax))
-               return PTR_ERR(dev_dax);
-
-       /* child dev_dax instances now own the lifetime of the dax_region */
-       dax_region_put(dax_region);
-       return 0;
-}
-
-static int dax_hmem_remove(struct platform_device *pdev)
-{
-       /* devm handles teardown */
-       return 0;
-}
-
-static struct platform_driver dax_hmem_driver = {
-       .probe = dax_hmem_probe,
-       .remove = dax_hmem_remove,
-       .driver = {
-               .name = "hmem",
-       },
-};
-
-module_platform_driver(dax_hmem_driver);
-
-MODULE_ALIAS("platform:hmem*");
-MODULE_LICENSE("GPL v2");
-MODULE_AUTHOR("Intel Corporation");
diff --git a/drivers/dax/hmem/Makefile b/drivers/dax/hmem/Makefile
new file mode 100644 (file)
index 0000000..a9d353d
--- /dev/null
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0
+obj-$(CONFIG_DEV_DAX_HMEM) += dax_hmem.o
+obj-$(CONFIG_DEV_DAX_HMEM_DEVICES) += device.o
+
+dax_hmem-y := hmem.o
diff --git a/drivers/dax/hmem/device.c b/drivers/dax/hmem/device.c
new file mode 100644 (file)
index 0000000..b9dd6b2
--- /dev/null
@@ -0,0 +1,65 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/platform_device.h>
+#include <linux/memregion.h>
+#include <linux/module.h>
+#include <linux/dax.h>
+#include <linux/mm.h>
+
+void hmem_register_device(int target_nid, struct resource *r)
+{
+       /* define a clean / non-busy resource for the platform device */
+       struct resource res = {
+               .start = r->start,
+               .end = r->end,
+               .flags = IORESOURCE_MEM,
+       };
+       struct platform_device *pdev;
+       struct memregion_info info;
+       int rc, id;
+
+       rc = region_intersects(res.start, resource_size(&res), IORESOURCE_MEM,
+                       IORES_DESC_SOFT_RESERVED);
+       if (rc != REGION_INTERSECTS)
+               return;
+
+       id = memregion_alloc(GFP_KERNEL);
+       if (id < 0) {
+               pr_err("memregion allocation failure for %pr\n", &res);
+               return;
+       }
+
+       pdev = platform_device_alloc("hmem", id);
+       if (!pdev) {
+               pr_err("hmem device allocation failure for %pr\n", &res);
+               goto out_pdev;
+       }
+
+       pdev->dev.numa_node = numa_map_to_online_node(target_nid);
+       info = (struct memregion_info) {
+               .target_node = target_nid,
+       };
+       rc = platform_device_add_data(pdev, &info, sizeof(info));
+       if (rc < 0) {
+               pr_err("hmem memregion_info allocation failure for %pr\n", &res);
+               goto out_pdev;
+       }
+
+       rc = platform_device_add_resources(pdev, &res, 1);
+       if (rc < 0) {
+               pr_err("hmem resource allocation failure for %pr\n", &res);
+               goto out_resource;
+       }
+
+       rc = platform_device_add(pdev);
+       if (rc < 0) {
+               dev_err(&pdev->dev, "device add failed for %pr\n", &res);
+               goto out_resource;
+       }
+
+       return;
+
+out_resource:
+       put_device(&pdev->dev);
+out_pdev:
+       memregion_free(id);
+}
diff --git a/drivers/dax/hmem/hmem.c b/drivers/dax/hmem/hmem.c
new file mode 100644 (file)
index 0000000..29ceb57
--- /dev/null
@@ -0,0 +1,56 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/platform_device.h>
+#include <linux/memregion.h>
+#include <linux/module.h>
+#include <linux/pfn_t.h>
+#include "../bus.h"
+
+static int dax_hmem_probe(struct platform_device *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct dev_pagemap pgmap = { };
+       struct dax_region *dax_region;
+       struct memregion_info *mri;
+       struct dev_dax *dev_dax;
+       struct resource *res;
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res)
+               return -ENOMEM;
+
+       mri = dev->platform_data;
+       memcpy(&pgmap.res, res, sizeof(*res));
+
+       dax_region = alloc_dax_region(dev, pdev->id, res, mri->target_node,
+                       PMD_SIZE, PFN_DEV|PFN_MAP);
+       if (!dax_region)
+               return -ENOMEM;
+
+       dev_dax = devm_create_dev_dax(dax_region, 0, &pgmap);
+       if (IS_ERR(dev_dax))
+               return PTR_ERR(dev_dax);
+
+       /* child dev_dax instances now own the lifetime of the dax_region */
+       dax_region_put(dax_region);
+       return 0;
+}
+
+static int dax_hmem_remove(struct platform_device *pdev)
+{
+       /* devm handles teardown */
+       return 0;
+}
+
+static struct platform_driver dax_hmem_driver = {
+       .probe = dax_hmem_probe,
+       .remove = dax_hmem_remove,
+       .driver = {
+               .name = "hmem",
+       },
+};
+
+module_platform_driver(dax_hmem_driver);
+
+MODULE_ALIAS("platform:hmem*");
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Intel Corporation");
index 43b39ab..4ec0bbf 100644 (file)
@@ -238,4 +238,12 @@ static inline bool dax_mapping(struct address_space *mapping)
        return mapping->host && IS_DAX(mapping->host);
 }
 
+#ifdef CONFIG_DEV_DAX_HMEM_DEVICES
+void hmem_register_device(int target_nid, struct resource *r);
+#else
+static inline void hmem_register_device(int target_nid, struct resource *r)
+{
+}
+#endif
+
 #endif