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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id BB4E0C05027 for ; Fri, 10 Feb 2023 22:09:07 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 573E16B011B; Fri, 10 Feb 2023 17:09:07 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 523A96B013C; Fri, 10 Feb 2023 17:09:07 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3EC266B0156; Fri, 10 Feb 2023 17:09:07 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 2F6636B011B for ; Fri, 10 Feb 2023 17:09:07 -0500 (EST) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id DDA80160580 for ; Fri, 10 Feb 2023 22:09:06 +0000 (UTC) X-FDA: 80452773492.13.B4D4827 Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by imf21.hostedemail.com (Postfix) with ESMTP id 2470B1C0011 for ; Fri, 10 Feb 2023 22:09:03 +0000 (UTC) Authentication-Results: imf21.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=fnBoYhqB; spf=pass (imf21.hostedemail.com: domain of dave.jiang@intel.com designates 192.55.52.115 as permitted sender) smtp.mailfrom=dave.jiang@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1676066945; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=MpaAGnbNeoYHYL4r5EL12OFk9IuBcr2OadI9HRDlvJ8=; b=pRQ0n6pmQGYDeVAgmRXPzQUG1xe+Wkyp1YyRfZzo0Rpj83kQdgtEJR2vUU8l2AYbH+NbqP 3Hk8f7oHbPhGJZma031eaFOYUqLyE5tjPNkc+1w1xBY8+r7nPlGlNBRPzWO6STUx6nVVNf 57yR62YvfGXPTB8nzGx1zBY2NevntX0= ARC-Authentication-Results: i=1; imf21.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=fnBoYhqB; spf=pass (imf21.hostedemail.com: domain of dave.jiang@intel.com designates 192.55.52.115 as permitted sender) smtp.mailfrom=dave.jiang@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1676066945; a=rsa-sha256; cv=none; b=fHy+mcFnRG2PCbCZv1Y30LXEQdj1vYD59cdv8Kw3Kgn35ZM87MlGsEIpcX/KSwLBwcTQRr dSurKT73u6snSEINMjxV36XALm/YNfdRz+Q+Czt+vrf+pXUZOVNvJCFh0tAyKYSrVcIGI4 qoxAT7ONqMnDLf6sKt1G0AyJQ3HYSIo= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1676066944; x=1707602944; h=message-id:date:mime-version:subject:to:cc:references: from:in-reply-to:content-transfer-encoding; bh=sY8OLIIt7+LZVX9JONJjX/aUMbbtvwjmsYGVh+lvMyE=; b=fnBoYhqBJ7VHYoZGz7869ME7zlGIZmWj9WsKmUqruQ17a7yyF1ajNNEe uYxTBUOiBL0kUwyIZa84wvKngUg8vCIz94u2QTiy7kQknAuwkspdpxTds qymg3jGD9ctjSceALsLlLvArCASZ57cien2QCuXSg65zkvT+Zug5ELOu5 9Fgxps5WUGz07NOYB4tDLBMVmLprV4RwB7VChRJFtpoilmfMxtSAqVSI0 pplmcI58RykAfLW/WxGHIsfXQ8yGWm4eJH1JDQdgQCEcHJAzcwCeuonF6 bk2QRbgIte7wBTpAqbcCa+b5TIDJZeTctEXrQ8f2L+75FgvAcflf9u9qd g==; X-IronPort-AV: E=McAfee;i="6500,9779,10617"; a="330547670" X-IronPort-AV: E=Sophos;i="5.97,287,1669104000"; d="scan'208";a="330547670" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Feb 2023 14:09:02 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10617"; a="842156715" X-IronPort-AV: E=Sophos;i="5.97,287,1669104000"; d="scan'208";a="842156715" Received: from djiang5-mobl3.amr.corp.intel.com (HELO [10.213.190.133]) ([10.213.190.133]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Feb 2023 14:09:01 -0800 Message-ID: <87d18c67-1b6a-6331-fb17-152ce9b7bd88@intel.com> Date: Fri, 10 Feb 2023 15:09:01 -0700 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0 Thunderbird/102.6.0 Subject: Re: [PATCH v2 18/20] dax/hmem: Move hmem device registration to dax_hmem.ko Content-Language: en-US To: Dan Williams , linux-cxl@vger.kernel.org Cc: Fan Ni , vishal.l.verma@intel.com, dave.hansen@linux.intel.com, linux-mm@kvack.org, linux-acpi@vger.kernel.org References: <167601992097.1924368.18291887895351917895.stgit@dwillia2-xfh.jf.intel.com> <167602002771.1924368.5653558226424530127.stgit@dwillia2-xfh.jf.intel.com> From: Dave Jiang In-Reply-To: <167602002771.1924368.5653558226424530127.stgit@dwillia2-xfh.jf.intel.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Rspam-User: X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 2470B1C0011 X-Stat-Signature: q3df6kxb8tm9p6bxkhg3tqgwafhqepf8 X-HE-Tag: 1676066943-109927 X-HE-Meta: U2FsdGVkX19U1SemzYS1yCiAdBK8b1T3WagJ4DEyLbEqasJ4MHAOcQXrGCjEhHuaHW9gvAwEAKX8iP/dSkXV5g623eroLGpf/5HdfNPRFbIQUFnRz75JBZAuCtzmhujoX/z09OCm95rwYlRfvdMD/xvF+TS1E6tDxmXlpyNVePGE428T/ZyYt275yRhic28anjQeSmNLNCYC95V4KMExuTulmpbCky39iMpHr+O2kxDzkkcZt/FGDx4mlMklTiNsbTkFrpzZ/94Uja/iIzXJ6yj0Me+vWfbj+rszE1WJS1DT+vEmr4B5F+U7tO1ET3IWr8Wa34w0bRQh4Pl4skYNAxflsmBLRUWuuoiz7b/0fcG3frS8VAEEKBEWwqiLy21/0lgOZLnU4ZUtMYb0eqCidzoGx5Rckpd0h/izNKRfBRwDWSqGtColBHDYsxQKifxHPW9GLbTvc2woxNWSz+k0lbkw6dRFTE2JeXPZlLcwnL8jxhBUoRttWBrTvai5WBkb85tfWjxjDRcEb+u26HuR6blBgTB4dra76oJbC2ppHWsTULSjBDqKmJQ2cUZOhPL2b8ajfSxCGKDG7UZJih2fdk4WPi9XCnj0abdE+5ksGY8RAvGfFK8+qt6POJToUhYR5PrCKMuiKywZ4nSAHIWC63Tm8GE4SYRcA5FRukv6iVU7I7uFesvYDSk09SrAc/z2FXKSO6yjhCIZu4hB+xwHCcdFIAdW38G/CnTrbVXi7n0xubVFBOJRSx+RBHrNJM+NoI2YIN5igpd63AXFUFXU/R158JuRO6uCCxMBsoQ8yv4KauAw3L+bHcKKfOcPTUC0oN/gu2sA4b8cMmGi4Wmq5Js7nAJXdCn+1aVc0U1JPeFpPjjXSinLocoTeoQfBl4zTu1Yx1ug3YEt1elN+JdypgjP32vwVKrWUoaXIwKDcHibjQQu1ISpt0lzT7C4NgozklH1kgGM+EhCsI0db/v uTWfigCa Bf5LniO2Wdc/yDCEm1rffsFWEGp8iS8NjfpqzjJAu2Ja82zYkYUdGaL03hildC+Hd+eN+ziPELcpMUEE0+EWSLzcFFj05iv69uT9gDEN9SPPNQcUCV2BX2b6zcX0e8VbgXKnwJ4yGJF6ROSpIjG0kz/gjbgfEYDGv8zETmq4NZnXVU4uVBZ7QvGBthtt9zJHQ0N2f2Supf/qzJcIyz8ayA6XcBHB+KpUyIFVUnjYv9mK8+FPQnPusensD8zG5hFwfsA7tPXGyaodtqJwYzz5uatIGohBnuVUvsuHfZkrYZRuUeEwDTXFBfICPXusGPgypUgQP 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: On 2/10/23 2:07 AM, Dan Williams wrote: > In preparation for the CXL region driver to take over the responsibility > of registering device-dax instances for CXL regions, move the > registration of "hmem" devices to dax_hmem.ko. > > Previously the builtin component of this enabling > (drivers/dax/hmem/device.o) would register platform devices for each > address range and trigger the dax_hmem.ko module to load and attach > device-dax instances to those devices. Now, the ranges are collected > from the HMAT and EFI memory map walking, but the device creation is > deferred. A new "hmem_platform" device is created which triggers > dax_hmem.ko to load and register the platform devices. > > Tested-by: Fan Ni > Link: https://lore.kernel.org/r/167564543923.847146.9030380223622044744.stgit@dwillia2-xfh.jf.intel.com > Signed-off-by: Dan Williams Reviewed-by: Dave Jiang > --- > drivers/acpi/numa/hmat.c | 2 - > drivers/dax/Kconfig | 2 - > drivers/dax/hmem/device.c | 91 +++++++++++++++++++-------------------- > drivers/dax/hmem/hmem.c | 105 +++++++++++++++++++++++++++++++++++++++++++++ > include/linux/dax.h | 7 ++- > 5 files changed, 155 insertions(+), 52 deletions(-) > > diff --git a/drivers/acpi/numa/hmat.c b/drivers/acpi/numa/hmat.c > index ff24282301ab..bba268ecd802 100644 > --- a/drivers/acpi/numa/hmat.c > +++ b/drivers/acpi/numa/hmat.c > @@ -718,7 +718,7 @@ static void hmat_register_target_devices(struct memory_target *target) > for (res = target->memregions.child; res; res = res->sibling) { > int target_nid = pxm_to_node(target->memory_pxm); > > - hmem_register_device(target_nid, res); > + hmem_register_resource(target_nid, res); > } > } > > diff --git a/drivers/dax/Kconfig b/drivers/dax/Kconfig > index 5fdf269a822e..d13c889c2a64 100644 > --- a/drivers/dax/Kconfig > +++ b/drivers/dax/Kconfig > @@ -46,7 +46,7 @@ config DEV_DAX_HMEM > Say M if unsure. > > config DEV_DAX_HMEM_DEVICES > - depends on DEV_DAX_HMEM && DAX=y > + depends on DEV_DAX_HMEM && DAX > def_bool y > > config DEV_DAX_KMEM > diff --git a/drivers/dax/hmem/device.c b/drivers/dax/hmem/device.c > index b1b339bccfe5..f9e1a76a04a9 100644 > --- a/drivers/dax/hmem/device.c > +++ b/drivers/dax/hmem/device.c > @@ -8,6 +8,8 @@ > static bool nohmem; > module_param_named(disable, nohmem, bool, 0444); > > +static bool platform_initialized; > +static DEFINE_MUTEX(hmem_resource_lock); > static struct resource hmem_active = { > .name = "HMEM devices", > .start = 0, > @@ -15,71 +17,66 @@ static struct resource hmem_active = { > .flags = IORESOURCE_MEM, > }; > > -void hmem_register_device(int target_nid, struct resource *res) > +int walk_hmem_resources(struct device *host, walk_hmem_fn fn) > +{ > + struct resource *res; > + int rc = 0; > + > + mutex_lock(&hmem_resource_lock); > + for (res = hmem_active.child; res; res = res->sibling) { > + rc = fn(host, (int) res->desc, res); > + if (rc) > + break; > + } > + mutex_unlock(&hmem_resource_lock); > + return rc; > +} > +EXPORT_SYMBOL_GPL(walk_hmem_resources); > + > +static void __hmem_register_resource(int target_nid, struct resource *res) > { > struct platform_device *pdev; > - struct memregion_info info; > - int rc, id; > + struct resource *new; > + int rc; > > - if (nohmem) > + new = __request_region(&hmem_active, res->start, resource_size(res), "", > + 0); > + if (!new) { > + pr_debug("hmem range %pr already active\n", res); > return; > + } > > - rc = region_intersects(res->start, resource_size(res), IORESOURCE_MEM, > - IORES_DESC_SOFT_RESERVED); > - if (rc != REGION_INTERSECTS) > - return; > + new->desc = target_nid; > > - id = memregion_alloc(GFP_KERNEL); > - if (id < 0) { > - pr_err("memregion allocation failure for %pr\n", res); > + if (platform_initialized) > return; > - } > > - pdev = platform_device_alloc("hmem", id); > + pdev = platform_device_alloc("hmem_platform", 0); > if (!pdev) { > - pr_err("hmem device allocation failure for %pr\n", res); > - goto out_pdev; > - } > - > - if (!__request_region(&hmem_active, res->start, resource_size(res), > - dev_name(&pdev->dev), 0)) { > - dev_dbg(&pdev->dev, "hmem range %pr already active\n", res); > - goto out_active; > - } > - > - pdev->dev.numa_node = numa_map_to_online_node(target_nid); > - info = (struct memregion_info) { > - .target_node = target_nid, > - .range = { > - .start = res->start, > - .end = res->end, > - }, > - }; > - 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_resource; > + pr_err_once("failed to register device-dax hmem_platform device\n"); > + return; > } > > rc = platform_device_add(pdev); > - if (rc < 0) { > - dev_err(&pdev->dev, "device add failed for %pr\n", res); > - goto out_resource; > - } > + if (rc) > + platform_device_put(pdev); > + else > + platform_initialized = true; > +} > > - return; > +void hmem_register_resource(int target_nid, struct resource *res) > +{ > + if (nohmem) > + return; > > -out_resource: > - __release_region(&hmem_active, res->start, resource_size(res)); > -out_active: > - platform_device_put(pdev); > -out_pdev: > - memregion_free(id); > + mutex_lock(&hmem_resource_lock); > + __hmem_register_resource(target_nid, res); > + mutex_unlock(&hmem_resource_lock); > } > > static __init int hmem_register_one(struct resource *res, void *data) > { > - hmem_register_device(phys_to_target_node(res->start), res); > + hmem_register_resource(phys_to_target_node(res->start), res); > > return 0; > } > diff --git a/drivers/dax/hmem/hmem.c b/drivers/dax/hmem/hmem.c > index 5025a8c9850b..e7bdff3132fa 100644 > --- a/drivers/dax/hmem/hmem.c > +++ b/drivers/dax/hmem/hmem.c > @@ -3,6 +3,7 @@ > #include > #include > #include > +#include > #include "../bus.h" > > static bool region_idle; > @@ -43,8 +44,110 @@ static struct platform_driver dax_hmem_driver = { > }, > }; > > -module_platform_driver(dax_hmem_driver); > +static void release_memregion(void *data) > +{ > + memregion_free((long) data); > +} > + > +static void release_hmem(void *pdev) > +{ > + platform_device_unregister(pdev); > +} > + > +static int hmem_register_device(struct device *host, int target_nid, > + const struct resource *res) > +{ > + struct platform_device *pdev; > + struct memregion_info info; > + long id; > + int rc; > + > + rc = region_intersects(res->start, resource_size(res), IORESOURCE_MEM, > + IORES_DESC_SOFT_RESERVED); > + if (rc != REGION_INTERSECTS) > + return 0; > + > + id = memregion_alloc(GFP_KERNEL); > + if (id < 0) { > + dev_err(host, "memregion allocation failure for %pr\n", res); > + return -ENOMEM; > + } > + rc = devm_add_action_or_reset(host, release_memregion, (void *) id); > + if (rc) > + return rc; > + > + pdev = platform_device_alloc("hmem", id); > + if (!pdev) { > + dev_err(host, "device allocation failure for %pr\n", res); > + return -ENOMEM; > + } > + > + pdev->dev.numa_node = numa_map_to_online_node(target_nid); > + info = (struct memregion_info) { > + .target_node = target_nid, > + .range = { > + .start = res->start, > + .end = res->end, > + }, > + }; > + rc = platform_device_add_data(pdev, &info, sizeof(info)); > + if (rc < 0) { > + dev_err(host, "memregion_info allocation failure for %pr\n", > + res); > + goto out_put; > + } > + > + rc = platform_device_add(pdev); > + if (rc < 0) { > + dev_err(host, "%s add failed for %pr\n", dev_name(&pdev->dev), > + res); > + goto out_put; > + } > + > + return devm_add_action_or_reset(host, release_hmem, pdev); > + > +out_put: > + platform_device_put(pdev); > + return rc; > +} > + > +static int dax_hmem_platform_probe(struct platform_device *pdev) > +{ > + return walk_hmem_resources(&pdev->dev, hmem_register_device); > +} > + > +static struct platform_driver dax_hmem_platform_driver = { > + .probe = dax_hmem_platform_probe, > + .driver = { > + .name = "hmem_platform", > + }, > +}; > + > +static __init int dax_hmem_init(void) > +{ > + int rc; > + > + rc = platform_driver_register(&dax_hmem_platform_driver); > + if (rc) > + return rc; > + > + rc = platform_driver_register(&dax_hmem_driver); > + if (rc) > + platform_driver_unregister(&dax_hmem_platform_driver); > + > + return rc; > +} > + > +static __exit void dax_hmem_exit(void) > +{ > + platform_driver_unregister(&dax_hmem_driver); > + platform_driver_unregister(&dax_hmem_platform_driver); > +} > + > +module_init(dax_hmem_init); > +module_exit(dax_hmem_exit); > > MODULE_ALIAS("platform:hmem*"); > +MODULE_ALIAS("platform:hmem_platform*"); > MODULE_LICENSE("GPL v2"); > MODULE_AUTHOR("Intel Corporation"); > diff --git a/include/linux/dax.h b/include/linux/dax.h > index 2b5ecb591059..bf6258472e49 100644 > --- a/include/linux/dax.h > +++ b/include/linux/dax.h > @@ -262,11 +262,14 @@ static inline bool dax_mapping(struct address_space *mapping) > } > > #ifdef CONFIG_DEV_DAX_HMEM_DEVICES > -void hmem_register_device(int target_nid, struct resource *r); > +void hmem_register_resource(int target_nid, struct resource *r); > #else > -static inline void hmem_register_device(int target_nid, struct resource *r) > +static inline void hmem_register_resource(int target_nid, struct resource *r) > { > } > #endif > > +typedef int (*walk_hmem_fn)(struct device *dev, int target_nid, > + const struct resource *res); > +int walk_hmem_resources(struct device *dev, walk_hmem_fn fn); > #endif >