diff options
Diffstat (limited to 'drivers/cxl/core/pmem.c')
| -rw-r--r-- | drivers/cxl/core/pmem.c | 42 | 
1 files changed, 4 insertions, 38 deletions
| diff --git a/drivers/cxl/core/pmem.c b/drivers/cxl/core/pmem.c index f3d2169b6731..c2e4b1093788 100644 --- a/drivers/cxl/core/pmem.c +++ b/drivers/cxl/core/pmem.c @@ -227,34 +227,16 @@ static struct cxl_nvdimm *cxl_nvdimm_alloc(struct cxl_nvdimm_bridge *cxl_nvb,  	return cxl_nvd;  } -static void cxl_nvd_unregister(void *_cxl_nvd) +static void cxlmd_release_nvdimm(void *_cxlmd)  { -	struct cxl_nvdimm *cxl_nvd = _cxl_nvd; -	struct cxl_memdev *cxlmd = cxl_nvd->cxlmd; +	struct cxl_memdev *cxlmd = _cxlmd; +	struct cxl_nvdimm *cxl_nvd = cxlmd->cxl_nvd;  	struct cxl_nvdimm_bridge *cxl_nvb = cxlmd->cxl_nvb; -	/* -	 * Either the bridge is in ->remove() context under the device_lock(), -	 * or cxlmd_release_nvdimm() is cancelling the bridge's release action -	 * for @cxl_nvd and doing it itself (while manually holding the bridge -	 * lock). -	 */ -	device_lock_assert(&cxl_nvb->dev);  	cxl_nvd->cxlmd = NULL;  	cxlmd->cxl_nvd = NULL; +	cxlmd->cxl_nvb = NULL;  	device_unregister(&cxl_nvd->dev); -} - -static void cxlmd_release_nvdimm(void *_cxlmd) -{ -	struct cxl_memdev *cxlmd = _cxlmd; -	struct cxl_nvdimm_bridge *cxl_nvb = cxlmd->cxl_nvb; - -	device_lock(&cxl_nvb->dev); -	if (cxlmd->cxl_nvd) -		devm_release_action(&cxl_nvb->dev, cxl_nvd_unregister, -				    cxlmd->cxl_nvd); -	device_unlock(&cxl_nvb->dev);  	put_device(&cxl_nvb->dev);  } @@ -293,22 +275,6 @@ int devm_cxl_add_nvdimm(struct cxl_memdev *cxlmd)  	dev_dbg(&cxlmd->dev, "register %s\n", dev_name(dev)); -	/* -	 * The two actions below arrange for @cxl_nvd to be deleted when either -	 * the top-level PMEM bridge goes down, or the endpoint device goes -	 * through ->remove(). -	 */ -	device_lock(&cxl_nvb->dev); -	if (cxl_nvb->dev.driver) -		rc = devm_add_action_or_reset(&cxl_nvb->dev, cxl_nvd_unregister, -					      cxl_nvd); -	else -		rc = -ENXIO; -	device_unlock(&cxl_nvb->dev); - -	if (rc) -		goto err_alloc; -  	/* @cxlmd carries a reference on @cxl_nvb until cxlmd_release_nvdimm */  	return devm_add_action_or_reset(&cxlmd->dev, cxlmd_release_nvdimm, cxlmd); |