From: "Zhijian Li (Fujitsu)" <lizhijian@fujitsu.com>
To: Dan Williams <dan.j.williams@intel.com>,
"dave.jiang@intel.com" <dave.jiang@intel.com>
Cc: Jonathan Cameron <Jonathan.Cameron@Huawei.com>,
"linux-cxl@vger.kernel.org" <linux-cxl@vger.kernel.org>
Subject: Re: [PATCH] cxl/region: Convert cxl_pmem_region_alloc to scope-based resource management
Date: Thu, 9 May 2024 07:04:09 +0000 [thread overview]
Message-ID: <90342f2f-48ab-4f45-a63b-b75e024d5aa7@fujitsu.com> (raw)
In-Reply-To: <171451430965.1147997.15782562063090960666.stgit@dwillia2-xfh.jf.intel.com>
On 01/05/2024 05:59, Dan Williams wrote:
> A recent bugfix to cxl_pmem_region_alloc() to fix an
> error-unwind-memleak [1], highlighted a use case for scope-based resource
> management.
>
> Delete the goto for releasing @cxl_region_rwsem, and return error codes
> directly from error condition paths.
>
> The caller, devm_cxl_add_pmem_region(), is no longer given @cxlr_pmem
> directly it must retrieve it from @cxlr->cxlr_pmem. This retrieval from
> @cxlr was already in place for @cxlr->cxl_nvb, and converting
> cxl_pmem_region_alloc() to return an int makes it less awkward to handle
> no_free_ptr().
>
> Cc: Li Zhijian <lizhijian@fujitsu.com>
> Reported-by: Jonathan Cameron <Jonathan.Cameron@Huawei.com>
> Closes: http://lore.kernel.org/r/20240430174540.000039ce@Huawei.com
> Link: http://lore.kernel.org/r/20240428030748.318985-1-lizhijian@fujitsu.com
> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Thanks, LGTM
Reviewed-by: Li Zhijian <lizhijian@fujitsu.com>
and
Tested-by: Li Zhijian <lizhijian@fujitsu.com>
> ---
> Hey Dave, this applies on top of Li's fix.
>
> drivers/cxl/core/region.c | 43 +++++++++++++++++--------------------------
> 1 file changed, 17 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
> index 812b2948b6c6..e0577d99c4db 100644
> --- a/drivers/cxl/core/region.c
> +++ b/drivers/cxl/core/region.c
> @@ -2681,26 +2681,21 @@ int cxl_get_poison_by_endpoint(struct cxl_port *port)
>
> static struct lock_class_key cxl_pmem_region_key;
>
> -static struct cxl_pmem_region *cxl_pmem_region_alloc(struct cxl_region *cxlr)
> +static int cxl_pmem_region_alloc(struct cxl_region *cxlr)
> {
> struct cxl_region_params *p = &cxlr->params;
> struct cxl_nvdimm_bridge *cxl_nvb;
> - struct cxl_pmem_region *cxlr_pmem;
> struct device *dev;
> int i;
>
> - down_read(&cxl_region_rwsem);
> - if (p->state != CXL_CONFIG_COMMIT) {
> - cxlr_pmem = ERR_PTR(-ENXIO);
> - goto out;
> - }
> + guard(rwsem_read)(&cxl_region_rwsem);
> + if (p->state != CXL_CONFIG_COMMIT)
> + return -ENXIO;
>
> - cxlr_pmem = kzalloc(struct_size(cxlr_pmem, mapping, p->nr_targets),
> - GFP_KERNEL);
> - if (!cxlr_pmem) {
> - cxlr_pmem = ERR_PTR(-ENOMEM);
> - goto out;
> - }
> + struct cxl_pmem_region *cxlr_pmem __free(kfree) = kzalloc(
> + struct_size(cxlr_pmem, mapping, p->nr_targets), GFP_KERNEL);
> + if (!cxlr_pmem)
> + return -ENOMEM;
>
> cxlr_pmem->hpa_range.start = p->res->start;
> cxlr_pmem->hpa_range.end = p->res->end;
> @@ -2718,11 +2713,8 @@ static struct cxl_pmem_region *cxl_pmem_region_alloc(struct cxl_region *cxlr)
> */
> if (i == 0) {
> cxl_nvb = cxl_find_nvdimm_bridge(cxlmd);
> - if (!cxl_nvb) {
> - kfree(cxlr_pmem);
> - cxlr_pmem = ERR_PTR(-ENODEV);
> - goto out;
> - }
> + if (!cxl_nvb)
> + return -ENODEV;
> cxlr->cxl_nvb = cxl_nvb;
> }
> m->cxlmd = cxlmd;
> @@ -2733,18 +2725,16 @@ static struct cxl_pmem_region *cxl_pmem_region_alloc(struct cxl_region *cxlr)
> }
>
> dev = &cxlr_pmem->dev;
> - cxlr_pmem->cxlr = cxlr;
> - cxlr->cxlr_pmem = cxlr_pmem;
> device_initialize(dev);
> lockdep_set_class(&dev->mutex, &cxl_pmem_region_key);
> device_set_pm_not_required(dev);
> dev->parent = &cxlr->dev;
> dev->bus = &cxl_bus_type;
> dev->type = &cxl_pmem_region_type;
> -out:
> - up_read(&cxl_region_rwsem);
> + cxlr_pmem->cxlr = cxlr;
> + cxlr->cxlr_pmem = no_free_ptr(cxlr_pmem);
>
> - return cxlr_pmem;
> + return 0;
> }
>
> static void cxl_dax_region_release(struct device *dev)
> @@ -2861,9 +2851,10 @@ static int devm_cxl_add_pmem_region(struct cxl_region *cxlr)
> struct device *dev;
> int rc;
>
> - cxlr_pmem = cxl_pmem_region_alloc(cxlr);
> - if (IS_ERR(cxlr_pmem))
> - return PTR_ERR(cxlr_pmem);
> + rc = cxl_pmem_region_alloc(cxlr);
> + if (rc)
> + return rc;
> + cxlr_pmem = cxlr->cxlr_pmem;
> cxl_nvb = cxlr->cxl_nvb;
>
> dev = &cxlr_pmem->dev;
>
prev parent reply other threads:[~2024-05-09 7:05 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-30 21:59 [PATCH] cxl/region: Convert cxl_pmem_region_alloc to scope-based resource management Dan Williams
2024-04-30 22:50 ` fan
2024-05-01 12:02 ` Jonathan Cameron
2024-05-01 23:27 ` Dan Williams
2024-05-09 7:04 ` Zhijian Li (Fujitsu) [this message]
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=90342f2f-48ab-4f45-a63b-b75e024d5aa7@fujitsu.com \
--to=lizhijian@fujitsu.com \
--cc=Jonathan.Cameron@Huawei.com \
--cc=dan.j.williams@intel.com \
--cc=dave.jiang@intel.com \
--cc=linux-cxl@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox