Message ID | 20250306164448.3354845-10-rrichter@amd.com |
---|---|
State | New |
Headers | show |
Series | cxl: Address translation support, part 1: Cleanups and refactoring | expand |
Robert Richter wrote: > In function cxl_add_to_region() there is code to determine a root > decoder's region. Factor that code out. This is in preparation to > further rework and simplify function cxl_add_to_region(). > > No functional changes. > > Signed-off-by: Robert Richter <rrichter@amd.com> > Reviewed-by: Gregory Price <gourry@gourry.net> > Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> > Reviewed-by: Dave Jiang <dave.jiang@intel.com> > Tested-by: Gregory Price <gourry@gourry.net> > --- > drivers/cxl/core/region.c | 24 ++++++++++++++++-------- > 1 file changed, 16 insertions(+), 8 deletions(-) > > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > index 7d9d9b8f9eea..70ff4c94fb7a 100644 > --- a/drivers/cxl/core/region.c > +++ b/drivers/cxl/core/region.c > @@ -3416,10 +3416,22 @@ static struct cxl_region *construct_region(struct cxl_root_decoder *cxlrd, > return cxlr; > } > > +static struct cxl_region * > +cxl_find_region_by_range(struct cxl_root_decoder *cxlrd, struct range *hpa) > +{ > + struct device *region_dev; > + > + region_dev = device_find_child(&cxlrd->cxlsd.cxld.dev, hpa, > + match_region_by_range); > + if (!region_dev) > + return NULL; > + > + return to_cxl_region(region_dev); > +} > + > int cxl_add_to_region(struct cxl_endpoint_decoder *cxled) > { > struct range *hpa = &cxled->cxld.hpa_range; > - struct device *region_dev; > struct cxl_root_decoder *cxlrd; > struct cxl_region_params *p; > struct cxl_region *cxlr; > @@ -3435,13 +3447,9 @@ int cxl_add_to_region(struct cxl_endpoint_decoder *cxled) > * one does the construction and the others add to that. > */ > mutex_lock(&cxlrd->range_lock); > - region_dev = device_find_child(&cxlrd->cxlsd.cxld.dev, hpa, > - match_region_by_range); > - if (!region_dev) { > + cxlr = cxl_find_region_by_range(cxlrd, hpa); > + if (!cxlr) > cxlr = construct_region(cxlrd, cxled); > - region_dev = &cxlr->dev; > - } else > - cxlr = to_cxl_region(region_dev); > mutex_unlock(&cxlrd->range_lock); > > rc = PTR_ERR_OR_ZERO(cxlr); > @@ -3466,7 +3474,7 @@ int cxl_add_to_region(struct cxl_endpoint_decoder *cxled) > p->res); > } > > - put_device(region_dev); > + put_device(&cxlr->dev); /* cxl_find_region_by_range() */ I would not mind a DEFINE_FREE(put_cxl_region, ...) to automate this cleanup, but other than that: Reviewed-by: Dan Williams <dan.j.williams@intel.com>
diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 7d9d9b8f9eea..70ff4c94fb7a 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -3416,10 +3416,22 @@ static struct cxl_region *construct_region(struct cxl_root_decoder *cxlrd, return cxlr; } +static struct cxl_region * +cxl_find_region_by_range(struct cxl_root_decoder *cxlrd, struct range *hpa) +{ + struct device *region_dev; + + region_dev = device_find_child(&cxlrd->cxlsd.cxld.dev, hpa, + match_region_by_range); + if (!region_dev) + return NULL; + + return to_cxl_region(region_dev); +} + int cxl_add_to_region(struct cxl_endpoint_decoder *cxled) { struct range *hpa = &cxled->cxld.hpa_range; - struct device *region_dev; struct cxl_root_decoder *cxlrd; struct cxl_region_params *p; struct cxl_region *cxlr; @@ -3435,13 +3447,9 @@ int cxl_add_to_region(struct cxl_endpoint_decoder *cxled) * one does the construction and the others add to that. */ mutex_lock(&cxlrd->range_lock); - region_dev = device_find_child(&cxlrd->cxlsd.cxld.dev, hpa, - match_region_by_range); - if (!region_dev) { + cxlr = cxl_find_region_by_range(cxlrd, hpa); + if (!cxlr) cxlr = construct_region(cxlrd, cxled); - region_dev = &cxlr->dev; - } else - cxlr = to_cxl_region(region_dev); mutex_unlock(&cxlrd->range_lock); rc = PTR_ERR_OR_ZERO(cxlr); @@ -3466,7 +3474,7 @@ int cxl_add_to_region(struct cxl_endpoint_decoder *cxled) p->res); } - put_device(region_dev); + put_device(&cxlr->dev); /* cxl_find_region_by_range() */ return rc; }