From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0D22AC433DF for ; Tue, 13 Oct 2020 23:49:19 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 9002522201 for ; Tue, 13 Oct 2020 23:49:18 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="GosMy3K8" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9002522201 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=linux-foundation.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 301BE6B0072; Tue, 13 Oct 2020 19:49:18 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2D8AC6B0073; Tue, 13 Oct 2020 19:49:18 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1EFCD6B0074; Tue, 13 Oct 2020 19:49:18 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0028.hostedemail.com [216.40.44.28]) by kanga.kvack.org (Postfix) with ESMTP id E6BA46B0072 for ; Tue, 13 Oct 2020 19:49:17 -0400 (EDT) Received: from smtpin06.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id 7D5CD8249980 for ; Tue, 13 Oct 2020 23:49:17 +0000 (UTC) X-FDA: 77368545954.06.beef53_14158a927207 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin06.hostedemail.com (Postfix) with ESMTP id 5B91C101FA524 for ; Tue, 13 Oct 2020 23:49:17 +0000 (UTC) X-HE-Tag: beef53_14158a927207 X-Filterd-Recvd-Size: 14753 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by imf42.hostedemail.com (Postfix) with ESMTP for ; Tue, 13 Oct 2020 23:49:16 +0000 (UTC) Received: from localhost.localdomain (c-73-231-172-41.hsd1.ca.comcast.net [73.231.172.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id A440421D81; Tue, 13 Oct 2020 23:49:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1602632955; bh=sun0mQETdRWCmBllFVKoDr3NvtgbsoGF3Y6laN4Q41M=; h=Date:From:To:Subject:In-Reply-To:From; b=GosMy3K8m/xcj48JN9aZi4oL6sb00Z79hy44zJB7xK/E+y1mZrDg7Y1+6Aidoka3D BDyp7k00hU05b8sqxgQX0wbGlRtznNRseU4kgz2IHL93GPTQd1Tij6OKlYo9HN0/p0 6v+JIsDF5gaxpxnndL+hbyhBQErU99L8V6Ia3YwE= Date: Tue, 13 Oct 2020 16:49:13 -0700 From: Andrew Morton To: airlied@linux.ie, akpm@linux-foundation.org, ard.biesheuvel@linaro.org, ardb@kernel.org, benh@kernel.crashing.org, bhelgaas@google.com, boris.ostrovsky@oracle.com, bp@alien8.de, Brice.Goglin@inria.fr, bskeggs@redhat.com, catalin.marinas@arm.com, dan.j.williams@intel.com, daniel@ffwll.ch, dave.hansen@linux.intel.com, dave.jiang@intel.com, david@redhat.com, gregkh@linuxfoundation.org, hpa@zytor.com, hulkci@huawei.com, ira.weiny@intel.com, jgg@mellanox.com, jglisse@redhat.com, jgross@suse.com, jmoyer@redhat.com, joao.m.martins@oracle.com, Jonathan.Cameron@huawei.com, justin.he@arm.com, linux-mm@kvack.org, lkp@intel.com, luto@kernel.org, mingo@redhat.com, mm-commits@vger.kernel.org, mpe@ellerman.id.au, pasha.tatashin@soleen.com, paulus@ozlabs.org, peterz@infradead.org, rafael.j.wysocki@intel.com, rdunlap@infradead.org, richard.weiyang@linux.alibaba.com, rppt@linux.ibm.com, sstabellini@kernel.org, tglx@linutronix.de, thomas.lendacky@amd.com, torvalds@linux-foundation.org, vgoyal@redhat.com, vishal.l.verma@intel.com, will@kernel.org, yanaijie@huawei.com Subject: [patch 029/181] ACPI: HMAT: refactor hmat_register_target_device to hmem_register_device Message-ID: <20201013234913.Im0fMSgJl%akpm@linux-foundation.org> In-Reply-To: <20201013164658.3bfd96cc224d8923e66a9f4e@linux-foundation.org> User-Agent: s-nail v14.8.16 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: =46rom: Dan Williams Subject: ACPI: HMAT: refactor hmat_register_target_device to hmem_register_= device 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 CO= NFIG_DAX=3Dy] Link: https://lkml.kernel.org/r/8f34727f-ec2d-9395-cb18-969ec8a5d0d4@orac= le.com Link: https://lkml.kernel.org/r/159643096584.4062302.5035370788475153738.st= git@dwillia2-desk3.amr.corp.intel.com Link: https://lore.kernel.org/r/158318761484.2216124.2049322072599482736.st= git@dwillia2-desk3.amr.corp.intel.com Signed-off-by: Dan Williams Signed-off-by: Joao Martins Cc: Andy Lutomirski Cc: Benjamin Herrenschmidt Cc: Ben Skeggs Cc: Borislav Petkov Cc: Brice Goglin Cc: Catalin Marinas Cc: Daniel Vetter Cc: Dave Hansen Cc: Dave Jiang Cc: David Airlie Cc: David Hildenbrand Cc: Greg Kroah-Hartman Cc: "H. Peter Anvin" Cc: Ingo Molnar Cc: Ira Weiny Cc: Jason Gunthorpe Cc: Jeff Moyer Cc: Jia He Cc: Joao Martins Cc: Jonathan Cameron Cc: Michael Ellerman Cc: Mike Rapoport Cc: Paul Mackerras Cc: Pavel Tatashin Cc: Peter Zijlstra Cc: Rafael J. Wysocki Cc: Thomas Gleixner Cc: Tom Lendacky Cc: Vishal Verma Cc: Wei Yang Cc: Will Deacon Cc: Ard Biesheuvel Cc: Ard Biesheuvel Cc: Bjorn Helgaas Cc: Boris Ostrovsky Cc: Hulk Robot Cc: Jason Yan Cc: "J=C3=A9r=C3=B4me Glisse" Cc: Juergen Gross Cc: kernel test robot Cc: Randy Dunlap Cc: Stefano Stabellini Cc: Vivek Goyal Signed-off-by: Andrew Morton --- drivers/acpi/numa/hmat.c | 68 +++--------------------------------- drivers/dax/Kconfig | 4 ++ drivers/dax/Makefile | 3 - drivers/dax/hmem.c | 56 ----------------------------- drivers/dax/hmem/Makefile | 5 ++ drivers/dax/hmem/device.c | 65 ++++++++++++++++++++++++++++++++++ drivers/dax/hmem/hmem.c | 56 +++++++++++++++++++++++++++++ include/linux/dax.h | 8 ++++ 8 files changed, 145 insertions(+), 120 deletions(-) --- a/drivers/acpi/numa/hmat.c~acpi-hmat-refactor-hmat_register_target_devi= ce-to-hmem_register_device +++ a/drivers/acpi/numa/hmat.c @@ -24,6 +24,7 @@ #include #include #include +#include =20 static u8 hmat_revision; static int hmat_disable __initdata; @@ -640,66 +641,6 @@ static void hmat_register_target_perf(st node_set_perf_attrs(mem_nid, &target->hmem_attrs, 0); } =20 -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 =3D { - .start =3D r->start, - .end =3D r->end, - .flags =3D IORESOURCE_MEM, - }; - struct platform_device *pdev; - struct memregion_info info; - int rc, id; - - rc =3D region_intersects(res.start, resource_size(&res), IORESOURCE_MEM, - IORES_DESC_SOFT_RESERVED); - if (rc !=3D REGION_INTERSECTS) - return; - - id =3D memregion_alloc(GFP_KERNEL); - if (id < 0) { - pr_err("memregion allocation failure for %pr\n", &res); - return; - } - - pdev =3D platform_device_alloc("hmem", id); - if (!pdev) { - pr_err("hmem device allocation failure for %pr\n", &res); - goto out_pdev; - } - - pdev->dev.numa_node =3D acpi_map_pxm_to_online_node(target->memory_pxm); - info =3D (struct memregion_info) { - .target_node =3D acpi_map_pxm_to_node(target->memory_pxm), - }; - rc =3D 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 =3D platform_device_add_resources(pdev, &res, 1); - if (rc < 0) { - pr_err("hmem resource allocation failure for %pr\n", &res); - goto out_resource; - } - - rc =3D 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 if (!IS_ENABLED(CONFIG_DEV_DAX_HMEM)) return; =20 - for (res =3D target->memregions.child; res; res =3D res->sibling) - hmat_register_target_device(target, res); + for (res =3D target->memregions.child; res; res =3D res->sibling) { + int target_nid =3D acpi_map_pxm_to_node(target->memory_pxm); + + hmem_register_device(target_nid, res); + } } =20 static void hmat_register_target(struct memory_target *target) --- a/drivers/dax/hmem.c +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#include -#include -#include -#include -#include "bus.h" - -static int dax_hmem_probe(struct platform_device *pdev) -{ - struct device *dev =3D &pdev->dev; - struct dev_pagemap pgmap =3D { }; - struct dax_region *dax_region; - struct memregion_info *mri; - struct dev_dax *dev_dax; - struct resource *res; - - res =3D platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) - return -ENOMEM; - - mri =3D dev->platform_data; - memcpy(&pgmap.res, res, sizeof(*res)); - - dax_region =3D alloc_dax_region(dev, pdev->id, res, mri->target_node, - PMD_SIZE, PFN_DEV|PFN_MAP); - if (!dax_region) - return -ENOMEM; - - dev_dax =3D 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 =3D { - .probe =3D dax_hmem_probe, - .remove =3D dax_hmem_remove, - .driver =3D { - .name =3D "hmem", - }, -}; - -module_platform_driver(dax_hmem_driver); - -MODULE_ALIAS("platform:hmem*"); -MODULE_LICENSE("GPL v2"); -MODULE_AUTHOR("Intel Corporation"); --- /dev/null +++ a/drivers/dax/hmem/device.c @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include + +void hmem_register_device(int target_nid, struct resource *r) +{ + /* define a clean / non-busy resource for the platform device */ + struct resource res =3D { + .start =3D r->start, + .end =3D r->end, + .flags =3D IORESOURCE_MEM, + }; + struct platform_device *pdev; + struct memregion_info info; + int rc, id; + + rc =3D region_intersects(res.start, resource_size(&res), IORESOURCE_MEM, + IORES_DESC_SOFT_RESERVED); + if (rc !=3D REGION_INTERSECTS) + return; + + id =3D memregion_alloc(GFP_KERNEL); + if (id < 0) { + pr_err("memregion allocation failure for %pr\n", &res); + return; + } + + pdev =3D platform_device_alloc("hmem", id); + if (!pdev) { + pr_err("hmem device allocation failure for %pr\n", &res); + goto out_pdev; + } + + pdev->dev.numa_node =3D numa_map_to_online_node(target_nid); + info =3D (struct memregion_info) { + .target_node =3D target_nid, + }; + rc =3D 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 =3D platform_device_add_resources(pdev, &res, 1); + if (rc < 0) { + pr_err("hmem resource allocation failure for %pr\n", &res); + goto out_resource; + } + + rc =3D 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); +} --- /dev/null +++ a/drivers/dax/hmem/hmem.c @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include +#include +#include +#include "../bus.h" + +static int dax_hmem_probe(struct platform_device *pdev) +{ + struct device *dev =3D &pdev->dev; + struct dev_pagemap pgmap =3D { }; + struct dax_region *dax_region; + struct memregion_info *mri; + struct dev_dax *dev_dax; + struct resource *res; + + res =3D platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) + return -ENOMEM; + + mri =3D dev->platform_data; + memcpy(&pgmap.res, res, sizeof(*res)); + + dax_region =3D alloc_dax_region(dev, pdev->id, res, mri->target_node, + PMD_SIZE, PFN_DEV|PFN_MAP); + if (!dax_region) + return -ENOMEM; + + dev_dax =3D 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 =3D { + .probe =3D dax_hmem_probe, + .remove =3D dax_hmem_remove, + .driver =3D { + .name =3D "hmem", + }, +}; + +module_platform_driver(dax_hmem_driver); + +MODULE_ALIAS("platform:hmem*"); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Intel Corporation"); --- /dev/null +++ a/drivers/dax/hmem/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0 +obj-$(CONFIG_DEV_DAX_HMEM) +=3D dax_hmem.o +obj-$(CONFIG_DEV_DAX_HMEM_DEVICES) +=3D device.o + +dax_hmem-y :=3D hmem.o --- a/drivers/dax/Kconfig~acpi-hmat-refactor-hmat_register_target_device-to= -hmem_register_device +++ a/drivers/dax/Kconfig @@ -48,6 +48,10 @@ config DEV_DAX_HMEM =20 Say M if unsure. =20 +config DEV_DAX_HMEM_DEVICES + depends on DEV_DAX_HMEM && DAX=3Dy + def_bool y + config DEV_DAX_KMEM tristate "KMEM DAX: volatile-use of persistent memory" default DEV_DAX --- a/drivers/dax/Makefile~acpi-hmat-refactor-hmat_register_target_device-t= o-hmem_register_device +++ a/drivers/dax/Makefile @@ -2,11 +2,10 @@ obj-$(CONFIG_DAX) +=3D dax.o obj-$(CONFIG_DEV_DAX) +=3D device_dax.o obj-$(CONFIG_DEV_DAX_KMEM) +=3D kmem.o -obj-$(CONFIG_DEV_DAX_HMEM) +=3D dax_hmem.o =20 dax-y :=3D super.o dax-y +=3D bus.o device_dax-y :=3D device.o -dax_hmem-y :=3D hmem.o =20 obj-y +=3D pmem/ +obj-y +=3D hmem/ --- a/include/linux/dax.h~acpi-hmat-refactor-hmat_register_target_device-to= -hmem_register_device +++ a/include/linux/dax.h @@ -238,4 +238,12 @@ static inline bool dax_mapping(struct ad return mapping->host && IS_DAX(mapping->host); } =20 +#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 _