From: Jason Gunthorpe <jgg@nvidia.com>
To: Dan Williams <dan.j.williams@intel.com>
Cc: linux-cxl@vger.kernel.org, ira.weiny@intel.com,
vishal.l.verma@intel.com, alison.schofield@intel.com,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 3/4] cxl/mem: Do not rely on device_add() side effects for dev_set_name() failures
Date: Thu, 25 Mar 2021 14:14:45 -0300 [thread overview]
Message-ID: <20210325171445.GE2356281@nvidia.com> (raw)
In-Reply-To: <161661972173.1721612.9458160848430375459.stgit@dwillia2-desk3.amr.corp.intel.com>
On Wed, Mar 24, 2021 at 02:02:01PM -0700, Dan Williams wrote:
> While device_add() will happen to catch dev_set_name() failures it is a
> broken pattern to follow given that the core may try to fall back to a
> different name.
>
> Add explicit checking for dev_set_name() failures to be cleaned up by
> put_device(). Skip cdev_device_add() and proceed directly to
> put_device() if the name set failure.
>
> Fixes: b39cb1052a5c ("cxl/mem: Register CXL memX devices")
> Reported-by: Jason Gunthorpe <jgg@nvidia.com>
> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
> drivers/cxl/mem.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/cxl/mem.c b/drivers/cxl/mem.c
> index e53d573ae4ab..d615f183520c 100644
> +++ b/drivers/cxl/mem.c
> @@ -1204,12 +1204,14 @@ static int cxl_mem_add_memdev(struct cxl_mem *cxlm)
> dev->bus = &cxl_bus_type;
> dev->devt = MKDEV(cxl_mem_major, cxlmd->id);
> dev->type = &cxl_memdev_type;
> - dev_set_name(dev, "mem%d", cxlmd->id);
>
> cdev = &cxlmd->cdev;
> cdev_init(cdev, &cxl_memdev_fops);
>
> - rc = cdev_device_add(cdev, dev);
> + rc = dev_set_name(dev, "mem%d", cxlmd->id);
> + if (rc == 0)
> + rc = cdev_device_add(cdev, dev);
Success oriented flow please
This is much nicer if you split the allocation, then this flow is
clean and simple. cxl_alloc_memdev() is undone by cxl_memdev_release()
and I would reorder the code so they are above/below each other, it is
easy to check and understand when logically paired functions are on
the same screen.
static struct cxl_memdev *cxl_alloc_memdev(struct cxl_mem *cxlm)
{
struct cxl_memdev *cxlmd;
struct device *dev;
cxlmd = kzalloc(sizeof(*cxlmd), GFP_KERNEL);
if (!cxlmd)
return PTR_ERR(-ENOMEM);
init_completion(&cxlmd->ops_dead);
cxlmd->cxlm = cxlm;
rc = ida_alloc_range(&cxl_memdev_ida, 0, CXL_MEM_MAX_DEVS, GFP_KERNEL);
if (rc < 0)
goto err_free;
cxlmd->id = rc;
/*
* @cxlm is deallocated when the driver unbinds so operations
* that are using it need to hold a live reference.
*/
rc = percpu_ref_init(&cxlmd->ops_active, cxlmdev_ops_active_release, 0,
GFP_KERNEL);
if (rc)
goto err_id;
dev = &cxlmd->dev;
dev->parent = &pdev->dev;
dev->bus = &cxl_bus_type;
dev->devt = MKDEV(cxl_mem_major, cxlmd->id);
dev->type = &cxl_memdev_type;
device_initialize(dev);
return cxlmd;
err_id:
ida_free(&cxl_memdev_ida, cxlmd->id);
err_free:
kfree(cxlmd);
return PTR_ERR(rc);
}
static int cxl_mem_add_memdev(struct cxl_mem *cxlm)
{
struct pci_dev *pdev = cxlm->pdev;
struct cdev *cdev;
int rc;
cxlmd = cxl_alloc_memdev(cxlm);
if (IS_ERR(cxlmd))
return ERR_PTR(cxlmd)
rc = dev_set_name(dev, "mem%d", cxlmd->id);
if (rc)
goto err;
cdev = &cxlmd->cdev;
cdev_init(cdev, &cxl_memdev_fops);
// Must be last
rc = cdev_device_add(cdev, dev);
if (rc)
goto err;
return devm_add_action_or_reset(dev->parent, cxlmdev_unregister, cxlmd);
err:
put_device(&cxlmd->dev);
return rc;
}
next prev parent reply other threads:[~2021-03-25 17:15 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-24 21:01 [PATCH 0/4] cxl/mem: Fix memdev device setup Dan Williams
2021-03-24 21:01 ` [PATCH 1/4] cxl/mem: Use sysfs_emit() for attribute show routines Dan Williams
2021-03-25 16:49 ` Jason Gunthorpe
2021-03-24 21:01 ` [PATCH 2/4] cxl/mem: Fix cdev_device_add() error handling Dan Williams
2021-03-25 17:11 ` Jason Gunthorpe
2021-03-29 21:03 ` Dan Williams
2021-03-29 22:44 ` Jason Gunthorpe
2021-03-30 4:48 ` Dan Williams
2021-03-24 21:02 ` [PATCH 3/4] cxl/mem: Do not rely on device_add() side effects for dev_set_name() failures Dan Williams
2021-03-25 17:14 ` Jason Gunthorpe [this message]
2021-03-24 21:02 ` [PATCH 4/4] cxl/mem: Disable cxl device power management Dan Williams
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=20210325171445.GE2356281@nvidia.com \
--to=jgg@nvidia.com \
--cc=alison.schofield@intel.com \
--cc=dan.j.williams@intel.com \
--cc=ira.weiny@intel.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--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.