[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <86b998af-a496-41fd-a4c7-2d7b622f1d15@intel.com>
Date: Mon, 28 Apr 2025 15:28:44 -0700
From: Dave Jiang <dave.jiang@...el.com>
To: Robert Richter <rrichter@....com>,
Alison Schofield <alison.schofield@...el.com>,
Vishal Verma <vishal.l.verma@...el.com>, Ira Weiny <ira.weiny@...el.com>,
Dan Williams <dan.j.williams@...el.com>,
Jonathan Cameron <Jonathan.Cameron@...wei.com>,
Davidlohr Bueso <dave@...olabs.net>
Cc: linux-cxl@...r.kernel.org, linux-kernel@...r.kernel.org,
Gregory Price <gourry@...rry.net>,
"Fabio M. De Francesco" <fabio.m.de.francesco@...ux.intel.com>,
Terry Bowman <terry.bowman@....com>
Subject: Re: [PATCH v5 06/14] cxl/region: Avoid duplicate call of
cxl_port_pick_region_decoder()
On 4/28/25 2:43 PM, Robert Richter wrote:
> Function cxl_port_pick_region_decoder() is called twice, in
> alloc_region_ref() and cxl_rr_alloc_decoder(). Both functions are
> subsequently called from cxl_port_attach_region(). Make the decoder a
> function argument to both which avoids a duplicate call of
> cxl_port_pick_region_decoder().
>
> Now, cxl_rr_alloc_decoder() no longer allocates the decoder. Instead,
> the previously picked decoder is assigned to the region reference.
> Hence, rename the function to cxl_rr_assign_decoder().
>
> Moving the call out of alloc_region_ref() also moves it out of the
> xa_for_each() loop in there. Now, cxld is determined no longer only
> for each auto-generated region, but now once for all regions
> regardless of auto-generated or not. This is fine as the cxld argument
> is needed for all regions in cxl_rr_assign_decoder() and an error would
> be returned otherwise anyway. So it is better to determine the decoder
> in front of all this and fail early if missing instead of running
> through all that code with multiple calls of
> cxl_port_pick_region_decoder().
>
> Signed-off-by: Robert Richter <rrichter@....com>
> Reviewed-by: Gregory Price <gourry@...rry.net>
> Tested-by: Gregory Price <gourry@...rry.net>
Reviewed-by: Dave Jiang <dave.jiang@...el.com>
> ---
> drivers/cxl/core/region.c | 35 +++++++++++++++++------------------
> 1 file changed, 17 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
> index e104035e0855..fa3d50982d04 100644
> --- a/drivers/cxl/core/region.c
> +++ b/drivers/cxl/core/region.c
> @@ -931,7 +931,8 @@ static bool auto_order_ok(struct cxl_port *port, struct cxl_region *cxlr_iter,
>
> static struct cxl_region_ref *
> alloc_region_ref(struct cxl_port *port, struct cxl_region *cxlr,
> - struct cxl_endpoint_decoder *cxled)
> + struct cxl_endpoint_decoder *cxled,
> + struct cxl_decoder *cxld)
> {
> struct cxl_region_params *p = &cxlr->params;
> struct cxl_region_ref *cxl_rr, *iter;
> @@ -945,9 +946,6 @@ alloc_region_ref(struct cxl_port *port, struct cxl_region *cxlr,
> continue;
>
> if (test_bit(CXL_REGION_F_AUTO, &cxlr->flags)) {
> - struct cxl_decoder *cxld;
> -
> - cxld = cxl_port_pick_region_decoder(port, cxled, cxlr);
> if (auto_order_ok(port, iter->region, cxld))
> continue;
> }
> @@ -1029,19 +1027,11 @@ static int cxl_rr_ep_add(struct cxl_region_ref *cxl_rr,
> return 0;
> }
>
> -static int cxl_rr_alloc_decoder(struct cxl_port *port, struct cxl_region *cxlr,
> - struct cxl_endpoint_decoder *cxled,
> - struct cxl_region_ref *cxl_rr)
> +static int cxl_rr_assign_decoder(struct cxl_port *port, struct cxl_region *cxlr,
> + struct cxl_endpoint_decoder *cxled,
> + struct cxl_region_ref *cxl_rr,
> + struct cxl_decoder *cxld)
> {
> - struct cxl_decoder *cxld;
> -
> - cxld = cxl_port_pick_region_decoder(port, cxled, cxlr);
> - if (!cxld) {
> - dev_dbg(&cxlr->dev, "%s: no decoder available\n",
> - dev_name(&port->dev));
> - return -EBUSY;
> - }
> -
> if (cxld->region) {
> dev_dbg(&cxlr->dev, "%s: %s already attached to %s\n",
> dev_name(&port->dev), dev_name(&cxld->dev),
> @@ -1132,7 +1122,16 @@ static int cxl_port_attach_region(struct cxl_port *port,
> nr_targets_inc = true;
> }
> } else {
> - cxl_rr = alloc_region_ref(port, cxlr, cxled);
> + struct cxl_decoder *cxld;
> +
> + cxld = cxl_port_pick_region_decoder(port, cxled, cxlr);
> + if (!cxld) {
> + dev_dbg(&cxlr->dev, "%s: no decoder available\n",
> + dev_name(&port->dev));
> + return -EBUSY;
> + }
> +
> + cxl_rr = alloc_region_ref(port, cxlr, cxled, cxld);
> if (IS_ERR(cxl_rr)) {
> dev_dbg(&cxlr->dev,
> "%s: failed to allocate region reference\n",
> @@ -1141,7 +1140,7 @@ static int cxl_port_attach_region(struct cxl_port *port,
> }
> nr_targets_inc = true;
>
> - rc = cxl_rr_alloc_decoder(port, cxlr, cxled, cxl_rr);
> + rc = cxl_rr_assign_decoder(port, cxlr, cxled, cxl_rr, cxld);
> if (rc)
> goto out_erase;
> }
Powered by blists - more mailing lists