Messages in this thread | | | From | "Zhijian Li (Fujitsu)" <> | Subject | Re: [PATCH 2/2] cxl/region: Fix missing put_device(region_dev) | Date | Mon, 29 Apr 2024 01:51:33 +0000 |
| |
On 29/04/2024 09:31, Li Zhijian wrote: >> mutex_lock(&cxlrd->range_lock); >> region_dev = device_find_child(&cxlrd->cxlsd.cxld.dev, hpa, >> match_region_by_range); >> if (!region_dev) >> cxlr = construct_region(cxlrd, cxled); >> else >> cxlr = to_cxl_region(region_dev); >> mutex_unlock(&cxlrd->range_lock); >> >> rc = PTR_ERR_OR_ZERO(cxlr);
Think again, PTR_ERR_OR_ZERO() here should be IS_ERR_OR_NULL()? PTR_ERR_OR_ZERO() returns 0 if cxlr is NULL, but the cxlr will be dereferenced later.
>> if (rc) >> goto out; >> >> if (!region_dev) >> region_dev = &cxlr->dev; > > When to_cxl_region(region_dev) fails, put_device(region_dev) should be > called to decrease the reference count added by device_find_child(). > > Simply put_device(region_dev) if region_dev is valid in the error path. > > Fixes: a32320b71f08 ("cxl/region: Add region autodiscovery") > Signed-off-by: Li Zhijian <lizhijian@fujitsu.com> > --- > drivers/cxl/core/region.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > index 3c80aa263a65..75390865382f 100644 > --- a/drivers/cxl/core/region.c > +++ b/drivers/cxl/core/region.c > @@ -3117,8 +3117,9 @@ int cxl_add_to_region(struct cxl_port *root, struct cxl_endpoint_decoder *cxled) > p->res); > } > > - put_device(region_dev); > out: > + if (region_dev) > + put_device(region_dev); > put_device(cxlrd_dev); > return rc; > }
| |