From patchwork Mon Feb 6 01:03:53 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Williams X-Patchwork-Id: 13129240 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 59433C636CD for ; Mon, 6 Feb 2023 01:03:57 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id EE6836B0083; Sun, 5 Feb 2023 20:03:56 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id E96296B0085; Sun, 5 Feb 2023 20:03:56 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D84D16B0087; Sun, 5 Feb 2023 20:03:56 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id C6A006B0083 for ; Sun, 5 Feb 2023 20:03:56 -0500 (EST) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id A78EEAAB0D for ; Mon, 6 Feb 2023 01:03:56 +0000 (UTC) X-FDA: 80435070072.01.0D22DA3 Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by imf18.hostedemail.com (Postfix) with ESMTP id 84FC01C0012 for ; Mon, 6 Feb 2023 01:03:54 +0000 (UTC) Authentication-Results: imf18.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b="av4WjYS/"; spf=pass (imf18.hostedemail.com: domain of dan.j.williams@intel.com designates 192.55.52.151 as permitted sender) smtp.mailfrom=dan.j.williams@intel.com; dmarc=pass (policy=none) header.from=intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1675645434; a=rsa-sha256; cv=none; b=uE9sufAesefDNZFDNqT9OakEPWmwJAtxB+GRDsF+nnawR2F2iMWPKm1z8eKKxNiCv0HE8p 6CAuyx3xujZPseV48rqfvGS7pftfV3ackMAgWI7PhqYGmruceHOYOESqfahkfukoOCUs0F QZlvzriFB7DCMZ+cYLYvStQlBfIv7bI= ARC-Authentication-Results: i=1; imf18.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b="av4WjYS/"; spf=pass (imf18.hostedemail.com: domain of dan.j.williams@intel.com designates 192.55.52.151 as permitted sender) smtp.mailfrom=dan.j.williams@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=1675645434; 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=KxV56fPJ4XnWvUyoBXg9UQfQNZA5DT3iJgCZKSpkNFg=; b=dLmq3W8Yy62AXLh1IXjK6CeLI3xJ3o8IwjZkO40cVJ5oVejeYpo9CDLe2/PebQfI7Q0Vj7 XyWzfez3hBWgPj1HgX1ZRBIzBI0VTXn4m/9YZ9vpt9H0/crpPdPXBEB3eoBpmXilPz44S5 GjAzinx2iUaNCcFfU4Kac2gxdUgJSCc= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1675645434; x=1707181434; h=subject:from:to:cc:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=UGjDlEaM3SmHqxTQJem08iZ8rEDpl61Vdevr59NhbRE=; b=av4WjYS/GIFWEccOeYzYOEsQ0c5yprUOqTWRziN3M+HEke2oc95HsbpP rurWoUn1GLC7IenNpl30oNu5tbai5dJRi1+ZUtMJSGJbMTMpdEDCmaSXU q7iJ/H//ICzTYR2MUa2JwY308x1cw6MbTqIuldYvbZTWe5Vwi/VScIlyZ 64IL8CuOWd6g0qYaGHWfjuwPRoyKBgkqm7iHf3PVvm9YlGGrlTZiMG9M9 H5S+htDW2oEDcdSLB7S37L+0J+gCj7svwN6sTjgaaYnR128/SpcOyuU1m hC5Li1DWuRhg1I3RdYPK1t7cTit+9l8nurCdcSvtQ4M6SceXs4cDial9K w==; X-IronPort-AV: E=McAfee;i="6500,9779,10612"; a="309442687" X-IronPort-AV: E=Sophos;i="5.97,276,1669104000"; d="scan'208";a="309442687" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Feb 2023 17:03:54 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10612"; a="775006720" X-IronPort-AV: E=Sophos;i="5.97,276,1669104000"; d="scan'208";a="775006720" Received: from mkrysak-mobl.amr.corp.intel.com (HELO dwillia2-xfh.jf.intel.com) ([10.212.255.187]) by fmsmga002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Feb 2023 17:03:53 -0800 Subject: [PATCH 15/18] dax/hmem: Convey the dax range via memregion_info() From: Dan Williams To: linux-cxl@vger.kernel.org Cc: dave.hansen@linux.intel.com, linux-mm@kvack.org, linux-acpi@vger.kernel.org Date: Sun, 05 Feb 2023 17:03:53 -0800 Message-ID: <167564543303.847146.11045895213318648441.stgit@dwillia2-xfh.jf.intel.com> In-Reply-To: <167564534874.847146.5222419648551436750.stgit@dwillia2-xfh.jf.intel.com> References: <167564534874.847146.5222419648551436750.stgit@dwillia2-xfh.jf.intel.com> User-Agent: StGit/0.18-3-g996c MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Queue-Id: 84FC01C0012 X-Rspamd-Server: rspam01 X-Stat-Signature: rcww4hb89y4ce38aztzrbmjz7k13uxnm X-HE-Tag: 1675645434-571586 X-HE-Meta: U2FsdGVkX193o2nBrzSS2JCKa5Oa9YrnE9rhzOEywvavnvBmi3k8qA9Mj15+X4TELKG7PzViN1M9srE9oScptnGzDph3zXQ6iUqd1lvaTJUqkh5u+dX4QA1ugtOC7qNaFFhJdLPXc4XwnEsOuLUezZV2UaXZC8KJM6/9Yye7U8IyP0/EZ382LL27SOTSc8AspwuBPSoh+sLyK5WDUFUi0XO/fKs/1DBry11N0HLL5L4cqPD97pQRU0EiPFAN9yRp+DuS3zQeMTgwkA6lhqAe3IRsSV42l1OrPuLWVLZckY2fjV3ceFkXtlWeJpuTyEUN7gAllwMklbHC2GjzF8t3xeLra5HxDaksxpcioFMI7kOixzQ1gx7PUo2ISyc5NOjuMm3BOuX0XQbi5ISo7Ktx9h3FX8jYh2boRMPWcsA95cr4VrZm4bvL41Yg1FDa25GIKBcxg3HrHYJR4qGY/lz88TaToS6nHc070itEGxgOA/nrdzf23VlgLUJJZoDibLaSomLJ0ZG3MYS45psbM1WtCCnFOn1ixQjiDH22vhb+F5tWfLuL1oE9KmY6merQAR5CWt7k0TqZyRkBkfHqISKV4QRU1YzL4JhcTMYARJJYEI/cJUBAvWeCMw2xoGaSiY8gC5Q+u98S3+JYR54Zv6kozNVtncKr16EnF+fU4LQr2nuTZPLrPa6NM2nhGFd0H4wetxeYDyWDzTd7dgd8yDp8zqgFzF9EiGLUys2Cnr76E+PYR4jKaavaWtEEfUnN614/0GDBzLx2cn7ZnSOi13o0XICUVLT5AxypYE/kty2aOhD+kvMBasJFzVf685j9s8oAjDu9IZO/Pko6Aba4opDHWFPUwVu+zgwSflKJGOTo2B1YGf9apXYTGPgPc8GbJTRS5iLsZf4c2Jj6N/Y0OUC2kiWUvlzxDl0ZDiKiCSnOrKB/UBISVExu85ZkceM/X5BZD7R1CwSHRfEOfbiqn4m 7QcxsGqt yAINfvSvThXUmEoYkjfAeB+G1/OgFbbrJ2XCXs6LYYlMYul47nOmr/piDWwqKhKAfdaoriKzN/gCfnAv++5bAVMdpteGQuw9lDhvVXhABfIuJxu67o4VViM7Oe7yFRpRJ6UTR8lRutwIpiABASzFyYK649fzJQ2qi3iRK8veufgMCkqEvUT8ZNYRx1vthQg2Z+7oyGvndlK5Zb8+X7SMyqWONhO9pUjnjxgIjzBzkQP4jHGw= 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: In preparation for hmem platform devices to be unregistered, stop using platform_device_add_resources() to convey the address range. The platform_device_add_resources() API causes an existing "Soft Reserved" iomem resource to be re-parented under an inserted platform device resource. When that platform device is deleted it removes the platform device resource and all children. Instead, it is sufficient to convey just the address range and let request_mem_region() insert resources to indicate the devices active in the range. This allows the "Soft Reserved" resource to be re-enumerated upon the next probe event. Signed-off-by: Dan Williams Reviewed-by: Jonathan Cameron --- drivers/dax/hmem/device.c | 37 ++++++++++++++----------------------- drivers/dax/hmem/hmem.c | 14 +++----------- include/linux/memregion.h | 2 ++ 3 files changed, 19 insertions(+), 34 deletions(-) diff --git a/drivers/dax/hmem/device.c b/drivers/dax/hmem/device.c index 20749c7fab81..b1b339bccfe5 100644 --- a/drivers/dax/hmem/device.c +++ b/drivers/dax/hmem/device.c @@ -15,15 +15,8 @@ static struct resource hmem_active = { .flags = IORESOURCE_MEM, }; -void hmem_register_device(int target_nid, struct resource *r) +void hmem_register_device(int target_nid, struct resource *res) { - /* define a clean / non-busy resource for the platform device */ - struct resource res = { - .start = r->start, - .end = r->end, - .flags = IORESOURCE_MEM, - .desc = IORES_DESC_SOFT_RESERVED, - }; struct platform_device *pdev; struct memregion_info info; int rc, id; @@ -31,55 +24,53 @@ void hmem_register_device(int target_nid, struct resource *r) if (nohmem) return; - rc = region_intersects(res.start, resource_size(&res), IORESOURCE_MEM, - IORES_DESC_SOFT_RESERVED); + 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); + 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); + pr_err("hmem device allocation failure for %pr\n", res); goto out_pdev; } - if (!__request_region(&hmem_active, res.start, resource_size(&res), + 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); + 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; - } - - rc = platform_device_add_resources(pdev, &res, 1); - if (rc < 0) { - pr_err("hmem resource allocation failure for %pr\n", &res); + pr_err("hmem memregion_info 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); + dev_err(&pdev->dev, "device add failed for %pr\n", res); goto out_resource; } return; out_resource: - __release_region(&hmem_active, res.start, resource_size(&res)); + __release_region(&hmem_active, res->start, resource_size(res)); out_active: platform_device_put(pdev); out_pdev: diff --git a/drivers/dax/hmem/hmem.c b/drivers/dax/hmem/hmem.c index c7351e0dc8ff..5025a8c9850b 100644 --- a/drivers/dax/hmem/hmem.c +++ b/drivers/dax/hmem/hmem.c @@ -15,25 +15,17 @@ static int dax_hmem_probe(struct platform_device *pdev) struct memregion_info *mri; struct dev_dax_data data; struct dev_dax *dev_dax; - struct resource *res; - struct range range; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!res) - return -ENOMEM; mri = dev->platform_data; - range.start = res->start; - range.end = res->end; - dax_region = alloc_dax_region(dev, pdev->id, &range, mri->target_node, - PMD_SIZE, 0); + dax_region = alloc_dax_region(dev, pdev->id, &mri->range, + mri->target_node, PMD_SIZE, 0); if (!dax_region) return -ENOMEM; data = (struct dev_dax_data) { .dax_region = dax_region, .id = -1, - .size = region_idle ? 0 : resource_size(res), + .size = region_idle ? 0 : range_len(&mri->range), }; dev_dax = devm_create_dev_dax(&data); if (IS_ERR(dev_dax)) diff --git a/include/linux/memregion.h b/include/linux/memregion.h index bf83363807ac..c01321467789 100644 --- a/include/linux/memregion.h +++ b/include/linux/memregion.h @@ -3,10 +3,12 @@ #define _MEMREGION_H_ #include #include +#include #include struct memregion_info { int target_node; + struct range range; }; #ifdef CONFIG_MEMREGION