All of lore.kernel.org
 help / color / mirror / Atom feed
From: Robert Richter <rrichter@amd.com>
To: Alison Schofield <alison.schofield@intel.com>,
	Vishal Verma <vishal.l.verma@intel.com>,
	Ira Weiny <ira.weiny@intel.com>,
	Dan Williams <dan.j.williams@intel.com>,
	Jonathan Cameron <Jonathan.Cameron@huawei.com>,
	Dave Jiang <dave.jiang@intel.com>,
	Davidlohr Bueso <dave@stgolabs.net>
Cc: <linux-cxl@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	Gregory Price <gourry@gourry.net>,
	"Fabio M. De Francesco" <fabio.m.de.francesco@linux.intel.com>,
	Terry Bowman <terry.bowman@amd.com>,
	Robert Richter <rrichter@amd.com>
Subject: [PATCH v4 08/14] cxl/region: Factor out code to find the root decoder
Date: Thu, 6 Mar 2025 17:44:42 +0100	[thread overview]
Message-ID: <20250306164448.3354845-9-rrichter@amd.com> (raw)
In-Reply-To: <20250306164448.3354845-1-rrichter@amd.com>

In function cxl_add_to_region() there is code to determine the root
decoder associated to an endpoint decoder. Factor out that code for
later reuse. This has the benefit of reducing cxl_add_to_region()'s
function complexity.

The reference of cxlrd_dev can be freed earlier. Since the root
decoder exists as long as the root port exists and the endpoint
already holds a reference to the root port, this additional reference
is not needed. Though it looks obvious to use __free() for the
reference of cxlrd_dev here too, this is done in a later rework. So
just move the code.

Signed-off-by: Robert Richter <rrichter@amd.com>
Reviewed-by: Gregory Price <gourry@gourry.net>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Tested-by: Gregory Price <gourry@gourry.net>
---
 drivers/cxl/core/region.c | 55 ++++++++++++++++++++++++++-------------
 1 file changed, 37 insertions(+), 18 deletions(-)

diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
index 8244a27d0fd6..7d9d9b8f9eea 100644
--- a/drivers/cxl/core/region.c
+++ b/drivers/cxl/core/region.c
@@ -3212,6 +3212,38 @@ static int match_root_decoder_by_range(struct device *dev,
 	return range_contains(r1, r2);
 }
 
+static struct cxl_root_decoder *
+cxl_find_root_decoder(struct cxl_endpoint_decoder *cxled)
+{
+	struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
+	struct cxl_port *port = cxled_to_port(cxled);
+	struct cxl_root *cxl_root __free(put_cxl_root) = find_cxl_root(port);
+	struct cxl_decoder *cxld = &cxled->cxld;
+	struct range *hpa = &cxld->hpa_range;
+	struct device *cxlrd_dev;
+
+	cxlrd_dev = device_find_child(&cxl_root->port.dev, hpa,
+				      match_root_decoder_by_range);
+	if (!cxlrd_dev) {
+		dev_err(cxlmd->dev.parent,
+			"%s:%s no CXL window for range %#llx:%#llx\n",
+			dev_name(&cxlmd->dev), dev_name(&cxld->dev),
+			cxld->hpa_range.start, cxld->hpa_range.end);
+		return NULL;
+	}
+
+	/*
+	 * device_find_child() created a reference to the root
+	 * decoder. Since the root decoder exists as long as the root
+	 * port exists and the endpoint already holds a reference to
+	 * the root port, this additional reference is not needed.
+	 * Free it here.
+	 */
+	put_device(cxlrd_dev);
+
+	return to_cxl_root_decoder(cxlrd_dev);
+}
+
 static int match_region_by_range(struct device *dev, const void *data)
 {
 	struct cxl_region_params *p;
@@ -3386,29 +3418,17 @@ static struct cxl_region *construct_region(struct cxl_root_decoder *cxlrd,
 
 int cxl_add_to_region(struct cxl_endpoint_decoder *cxled)
 {
-	struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
-	struct cxl_port *port = cxled_to_port(cxled);
-	struct cxl_root *cxl_root __free(put_cxl_root) = find_cxl_root(port);
 	struct range *hpa = &cxled->cxld.hpa_range;
-	struct cxl_decoder *cxld = &cxled->cxld;
-	struct device *cxlrd_dev, *region_dev;
+	struct device *region_dev;
 	struct cxl_root_decoder *cxlrd;
 	struct cxl_region_params *p;
 	struct cxl_region *cxlr;
 	bool attach = false;
 	int rc;
 
-	cxlrd_dev = device_find_child(&cxl_root->port.dev, &cxld->hpa_range,
-				      match_root_decoder_by_range);
-	if (!cxlrd_dev) {
-		dev_err(cxlmd->dev.parent,
-			"%s:%s no CXL window for range %#llx:%#llx\n",
-			dev_name(&cxlmd->dev), dev_name(&cxld->dev),
-			cxld->hpa_range.start, cxld->hpa_range.end);
+	cxlrd = cxl_find_root_decoder(cxled);
+	if (!cxlrd)
 		return -ENXIO;
-	}
-
-	cxlrd = to_cxl_root_decoder(cxlrd_dev);
 
 	/*
 	 * Ensure that if multiple threads race to construct_region() for @hpa
@@ -3426,7 +3446,7 @@ int cxl_add_to_region(struct cxl_endpoint_decoder *cxled)
 
 	rc = PTR_ERR_OR_ZERO(cxlr);
 	if (rc)
-		goto out;
+		return rc;
 
 	attach_target(cxlr, cxled, -1, TASK_UNINTERRUPTIBLE);
 
@@ -3447,8 +3467,7 @@ int cxl_add_to_region(struct cxl_endpoint_decoder *cxled)
 	}
 
 	put_device(region_dev);
-out:
-	put_device(cxlrd_dev);
+
 	return rc;
 }
 EXPORT_SYMBOL_NS_GPL(cxl_add_to_region, "CXL");
-- 
2.39.5


  parent reply	other threads:[~2025-03-06 16:45 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-03-06 16:44 [PATCH v4 00/14] cxl: Address translation support, part 1: Cleanups and refactoring Robert Richter
2025-03-06 16:44 ` [PATCH v4 01/14] cxl: Remove else after return Robert Richter
2025-03-14 11:27   ` Jonathan Cameron
2025-04-15 21:27   ` Alison Schofield
2025-04-18 16:23   ` Fabio M. De Francesco
2025-03-06 16:44 ` [PATCH v4 02/14] cxl/pci: Moving code in cxl_hdm_decode_init() Robert Richter
2025-03-14 11:31   ` Jonathan Cameron
2025-04-15 21:29   ` Alison Schofield
2025-04-18 16:28   ` Fabio M. De Francesco
2025-03-06 16:44 ` [PATCH v4 03/14] cxl/pci: Add comments to cxl_hdm_decode_init() Robert Richter
2025-03-14 11:33   ` Jonathan Cameron
2025-04-17 13:11     ` Robert Richter
2025-04-15 21:30   ` Alison Schofield
2025-04-17 13:48   ` Gregory Price
2025-04-18 16:34   ` Fabio M. De Francesco
2025-03-06 16:44 ` [PATCH v4 04/14] cxl: Introduce parent_port_of() helper Robert Richter
2025-03-06 18:57   ` Dan Williams
2025-04-15 21:30   ` Alison Schofield
2025-04-21 17:49   ` Fabio M. De Francesco
2025-03-06 16:44 ` [PATCH v4 05/14] cxl/region: Rename function to cxl_find_decoder_early() Robert Richter
2025-03-06 19:51   ` Dan Williams
2025-03-06 16:44 ` [PATCH v4 06/14] cxl/region: Avoid duplicate call of cxl_find_decoder_early() Robert Richter
2025-03-06 20:01   ` Dan Williams
2025-03-06 16:44 ` [PATCH v4 07/14] cxl/region: Move find_cxl_root() to cxl_add_to_region() Robert Richter
2025-03-06 20:14   ` Dan Williams
2025-04-15 21:32   ` Alison Schofield
2025-04-21 21:21   ` Fabio M. De Francesco
2025-03-06 16:44 ` Robert Richter [this message]
2025-03-06 20:35   ` [PATCH v4 08/14] cxl/region: Factor out code to find the root decoder Dan Williams
2025-04-15 21:32   ` Alison Schofield
2025-04-22 16:09   ` Fabio M. De Francesco
2025-03-06 16:44 ` [PATCH v4 09/14] cxl/region: Factor out code to find a root decoder's region Robert Richter
2025-03-06 20:37   ` Dan Williams
2025-04-15 21:33   ` Alison Schofield
2025-04-23 15:32   ` Fabio M. De Francesco
2025-03-06 16:44 ` [PATCH v4 10/14] cxl/region: Add function to find a port's switch decoder by range Robert Richter
2025-03-06 20:55   ` Dan Williams
2025-03-06 16:44 ` [PATCH v4 11/14] cxl/region: Add a dev_warn() on registration failure Robert Richter
2025-03-06 20:57   ` Dan Williams
2025-04-15 21:34   ` Alison Schofield
2025-04-23 20:49   ` Fabio M. De Francesco
2025-03-06 16:44 ` [PATCH v4 12/14] cxl/region: Add a dev_err() on missing target list entries Robert Richter
2025-03-06 20:58   ` Dan Williams
2025-04-15 21:35   ` Alison Schofield
2025-04-23 20:50   ` Fabio M. De Francesco
2025-03-06 16:44 ` [PATCH v4 13/14] cxl: Add a dev_dbg() when a decoder was added to a port Robert Richter
2025-03-06 21:06   ` Dan Williams
2025-04-29 13:43     ` Robert Richter
2025-04-15 21:36   ` Alison Schofield
2025-03-06 16:44 ` [PATCH v4 14/14] cxl/acpi: Unify CFMWS memory log messages with SRAT messages Robert Richter
2025-03-06 21:12   ` Dan Williams
2025-04-15 23:23 ` [PATCH v4 00/14] cxl: Address translation support, part 1: Cleanups and refactoring Alison Schofield

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250306164448.3354845-9-rrichter@amd.com \
    --to=rrichter@amd.com \
    --cc=Jonathan.Cameron@huawei.com \
    --cc=alison.schofield@intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=dave.jiang@intel.com \
    --cc=dave@stgolabs.net \
    --cc=fabio.m.de.francesco@linux.intel.com \
    --cc=gourry@gourry.net \
    --cc=ira.weiny@intel.com \
    --cc=linux-cxl@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=terry.bowman@amd.com \
    --cc=vishal.l.verma@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.