From: Jonathan Cameron <Jonathan.Cameron@huawei.com>
To: Li Ming <ming.li@zohomail.com>
Cc: <dave@stgolabs.net>, <dave.jiang@intel.com>,
<alison.schofield@intel.com>, <vishal.l.verma@intel.com>,
<ira.weiny@intel.com>, <dan.j.williams@intel.com>,
<linux-cxl@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v1 7/7] cxl/region: Drop goto pattern of construct_region()
Date: Tue, 11 Feb 2025 17:36:06 +0000 [thread overview]
Message-ID: <20250211173606.00004d33@huawei.com> (raw)
In-Reply-To: <20250211075727.351895-8-ming.li@zohomail.com>
On Tue, 11 Feb 2025 15:57:27 +0800
Li Ming <ming.li@zohomail.com> wrote:
> Some operations need to be procted by the cxl_region_rwsem in construct
> region(). Currently, construct_region() uses down_write() and up_write()
> for the cxl_region_rwsem, so there is a goto pattern after down_write()
> invoked to release cxl_region_rwsem.
>
> construct region() can be optimized to remove the goto pattern. The
> changes are creating a new function called __construct_region() which
> will include all checking and operations protected by the
> cxl_region_rwsem, and using guard(rwsem_write) to replace down_write()
> and up_write() in __construct_region().
>
> Signed-off-by: Li Ming <ming.li@zohomail.com>
> ---
> drivers/cxl/core/region.c | 71 +++++++++++++++++++++------------------
> 1 file changed, 39 insertions(+), 32 deletions(-)
>
> diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
> index 36f3771818d3..170278bdcedc 100644
> --- a/drivers/cxl/core/region.c
> +++ b/drivers/cxl/core/region.c
> @@ -3217,49 +3217,31 @@ static int match_region_by_range(struct device *dev, const void *data)
> return rc;
> }
>
> -/* Establish an empty region covering the given HPA range */
> -static struct cxl_region *construct_region(struct cxl_root_decoder *cxlrd,
> - struct cxl_endpoint_decoder *cxled)
> +static int __construct_region(struct cxl_region *cxlr,
This is only factoring out part, so I'm not sure the naming makes sense.
I don't have a better name however as this is doing various different things...
setup_region() doesn't feel right either...
> + struct cxl_root_decoder *cxlrd,
> + struct cxl_endpoint_decoder *cxled)
> {
> struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
> - struct cxl_port *port = cxlrd_to_port(cxlrd);
> struct range *hpa = &cxled->cxld.hpa_range;
> struct cxl_region_params *p;
> - struct cxl_region *cxlr;
> struct resource *res;
> int rc;
>
> - do {
> - cxlr = __create_region(cxlrd, cxled->mode,
> - atomic_read(&cxlrd->region_id));
> - } while (IS_ERR(cxlr) && PTR_ERR(cxlr) == -EBUSY);
> -
> - if (IS_ERR(cxlr)) {
> - dev_err(cxlmd->dev.parent,
> - "%s:%s: %s failed assign region: %ld\n",
> - dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev),
> - __func__, PTR_ERR(cxlr));
> - return cxlr;
> - }
> -
> - down_write(&cxl_region_rwsem);
> + guard(rwsem_write)(&cxl_region_rwsem);
> p = &cxlr->params;
> if (p->state >= CXL_CONFIG_INTERLEAVE_ACTIVE) {
> dev_err(cxlmd->dev.parent,
> "%s:%s: %s autodiscovery interrupted\n",
> dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev),
> __func__);
> - rc = -EBUSY;
> - goto err;
> + return -EBUSY;
> }
>
> set_bit(CXL_REGION_F_AUTO, &cxlr->flags);
>
> res = kmalloc(sizeof(*res), GFP_KERNEL);
> - if (!res) {
> - rc = -ENOMEM;
> - goto err;
> - }
> + if (!res)
> + return -ENOMEM;
>
> *res = DEFINE_RES_MEM_NAMED(hpa->start, range_len(hpa),
> dev_name(&cxlr->dev));
> @@ -3282,7 +3264,7 @@ static struct cxl_region *construct_region(struct cxl_root_decoder *cxlrd,
>
> rc = sysfs_update_group(&cxlr->dev.kobj, get_cxl_region_target_group());
> if (rc)
> - goto err;
> + return rc;
>
> dev_dbg(cxlmd->dev.parent, "%s:%s: %s %s res: %pr iw: %d ig: %d\n",
> dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), __func__,
> @@ -3291,14 +3273,39 @@ static struct cxl_region *construct_region(struct cxl_root_decoder *cxlrd,
>
> /* ...to match put_device() in cxl_add_to_region() */
> get_device(&cxlr->dev);
> - up_write(&cxl_region_rwsem);
>
> - return cxlr;
> + return 0;
> +}
>
> -err:
> - up_write(&cxl_region_rwsem);
> - devm_release_action(port->uport_dev, unregister_region, cxlr);
> - return ERR_PTR(rc);
> +/* Establish an empty region covering the given HPA range */
> +static struct cxl_region *construct_region(struct cxl_root_decoder *cxlrd,
> + struct cxl_endpoint_decoder *cxled)
> +{
> + struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
> + struct cxl_port *port = cxlrd_to_port(cxlrd);
> + struct cxl_region *cxlr;
> + int rc;
> +
> + do {
> + cxlr = __create_region(cxlrd, cxled->mode,
> + atomic_read(&cxlrd->region_id));
> + } while (IS_ERR(cxlr) && PTR_ERR(cxlr) == -EBUSY);
> +
> + if (IS_ERR(cxlr)) {
> + dev_err(cxlmd->dev.parent,
> + "%s:%s: %s failed assign region: %ld\n",
> + dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev),
> + __func__, PTR_ERR(cxlr));
> + return cxlr;
> + }
> +
> + rc = __construct_region(cxlr, cxlrd, cxled);
> + if (rc) {
> + devm_release_action(port->uport_dev, unregister_region, cxlr);
> + return ERR_PTR(rc);
> + }
> +
> + return cxlr;
> }
>
> int cxl_add_to_region(struct cxl_port *root, struct cxl_endpoint_decoder *cxled)
next prev parent reply other threads:[~2025-02-11 17:36 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-11 7:57 [PATCH v1 0/7] Use guard() instead of rwsem locking Li Ming
2025-02-11 7:57 ` [PATCH v1 1/7] cxl/core: Use guard() to replace open-coded down_read/write() Li Ming
2025-02-11 17:26 ` Jonathan Cameron
2025-02-12 6:36 ` Li Ming
2025-02-11 7:57 ` [PATCH v1 2/7] cxl/core: cxl_mem_sanitize() cleanup Li Ming
2025-02-11 17:27 ` Jonathan Cameron
2025-02-11 7:57 ` [PATCH v1 3/7] cxl/memdev: cxl_memdev_ioctl() cleanup Li Ming
2025-02-11 17:28 ` Jonathan Cameron
2025-02-11 7:57 ` [PATCH v1 4/7] cxl/core: Use guard() to drop the goto pattern of cxl_dpa_free() Li Ming
2025-02-11 17:30 ` Jonathan Cameron
2025-02-11 7:57 ` [PATCH v1 5/7] cxl/core: Use guard() to drop goto pattern of cxl_dpa_alloc() Li Ming
2025-02-11 17:32 ` Jonathan Cameron
2025-02-11 7:57 ` [PATCH v1 6/7] cxl/region: Drop goto pattern in cxl_dax_region_alloc() Li Ming
2025-02-11 17:32 ` Jonathan Cameron
2025-02-11 7:57 ` [PATCH v1 7/7] cxl/region: Drop goto pattern of construct_region() Li Ming
2025-02-11 17:36 ` Jonathan Cameron [this message]
2025-02-11 21:24 ` Dave Jiang
2025-02-13 4:15 ` Li Ming
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=20250211173606.00004d33@huawei.com \
--to=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=ira.weiny@intel.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ming.li@zohomail.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.