Rather than unlocking the region rwsem in the middle of cxl_region_probe()
create a helper for determining when the region is ready-to-probe.
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Jonathan Cameron <jonathan.cameron@huawei.com>
Cc: Dave Jiang <dave.jiang@intel.com>
Cc: Alison Schofield <alison.schofield@intel.com>
Cc: Vishal Verma <vishal.l.verma@intel.com>
Cc: Ira Weiny <ira.weiny@intel.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
drivers/cxl/core/region.c | 24 ++++++++++++++++++------
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
index 3a77aec2c447..2a97fa9a394f 100644
--- a/drivers/cxl/core/region.c
+++ b/drivers/cxl/core/region.c
@@ -3572,9 +3572,8 @@ static void shutdown_notifiers(void *_cxlr)
unregister_mt_adistance_algorithm(&cxlr->adist_notifier);
}
-static int cxl_region_probe(struct device *dev)
+static int cxl_region_can_probe(struct cxl_region *cxlr)
{
- struct cxl_region *cxlr = to_cxl_region(dev);
struct cxl_region_params *p = &cxlr->params;
int rc;
@@ -3597,15 +3596,28 @@ static int cxl_region_probe(struct device *dev)
goto out;
}
- /*
- * From this point on any path that changes the region's state away from
- * CXL_CONFIG_COMMIT is also responsible for releasing the driver.
- */
out:
up_read(&cxl_region_rwsem);
if (rc)
return rc;
+ return 0;
+}
+
+static int cxl_region_probe(struct device *dev)
+{
+ struct cxl_region *cxlr = to_cxl_region(dev);
+ struct cxl_region_params *p = &cxlr->params;
+ int rc;
+
+ rc = cxl_region_can_probe(cxlr);
+ if (rc)
+ return rc;
+
+ /*
+ * From this point on any path that changes the region's state away from
+ * CXL_CONFIG_COMMIT is also responsible for releasing the driver.
+ */
cxlr->memory_notifier.notifier_call = cxl_region_perf_attrs_callback;
cxlr->memory_notifier.priority = CXL_CALLBACK_PRI;
--
2.50.0
On Fri, 11 Jul 2025 16:49:30 -0700 Dan Williams <dan.j.williams@intel.com> wrote: > Rather than unlocking the region rwsem in the middle of cxl_region_probe() > create a helper for determining when the region is ready-to-probe. I'd maybe mention the odd bit of if (rc) return rc; return 0; Will go away shortly. Or maybe that is overkill for a commit message. Anyhow, with that in mind LGTM Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> > > Cc: Davidlohr Bueso <dave@stgolabs.net> > Cc: Jonathan Cameron <jonathan.cameron@huawei.com> > Cc: Dave Jiang <dave.jiang@intel.com> > Cc: Alison Schofield <alison.schofield@intel.com> > Cc: Vishal Verma <vishal.l.verma@intel.com> > Cc: Ira Weiny <ira.weiny@intel.com> > Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> > Reviewed-by: Dave Jiang <dave.jiang@intel.com> > Signed-off-by: Dan Williams <dan.j.williams@intel.com> > --- > drivers/cxl/core/region.c | 24 ++++++++++++++++++------ > 1 file changed, 18 insertions(+), 6 deletions(-) > > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > index 3a77aec2c447..2a97fa9a394f 100644 > --- a/drivers/cxl/core/region.c > +++ b/drivers/cxl/core/region.c > @@ -3572,9 +3572,8 @@ static void shutdown_notifiers(void *_cxlr) > unregister_mt_adistance_algorithm(&cxlr->adist_notifier); > } > > -static int cxl_region_probe(struct device *dev) > +static int cxl_region_can_probe(struct cxl_region *cxlr) > { > - struct cxl_region *cxlr = to_cxl_region(dev); > struct cxl_region_params *p = &cxlr->params; > int rc; > > @@ -3597,15 +3596,28 @@ static int cxl_region_probe(struct device *dev) > goto out; > } > > - /* > - * From this point on any path that changes the region's state away from > - * CXL_CONFIG_COMMIT is also responsible for releasing the driver. > - */ > out: > up_read(&cxl_region_rwsem); > > if (rc) > return rc; > + return 0; This is an odd bit of code now. Why not just return rc; Ah. Patch 8 drops the if (rc) return rc bit. > +} > + > +static int cxl_region_probe(struct device *dev) > +{ > + struct cxl_region *cxlr = to_cxl_region(dev); > + struct cxl_region_params *p = &cxlr->params; > + int rc; > + > + rc = cxl_region_can_probe(cxlr); > + if (rc) > + return rc; > + > + /* > + * From this point on any path that changes the region's state away from > + * CXL_CONFIG_COMMIT is also responsible for releasing the driver. > + */ > > cxlr->memory_notifier.notifier_call = cxl_region_perf_attrs_callback; > cxlr->memory_notifier.priority = CXL_CALLBACK_PRI;
Jonathan Cameron wrote: > On Fri, 11 Jul 2025 16:49:30 -0700 > Dan Williams <dan.j.williams@intel.com> wrote: > > > Rather than unlocking the region rwsem in the middle of cxl_region_probe() > > create a helper for determining when the region is ready-to-probe. > I'd maybe mention the odd bit of > if (rc) > return rc; > > return 0; > > Will go away shortly. Or maybe that is overkill for a commit message. > > Anyhow, with that in mind LGTM > Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com> > > > > > > Cc: Davidlohr Bueso <dave@stgolabs.net> > > Cc: Jonathan Cameron <jonathan.cameron@huawei.com> > > Cc: Dave Jiang <dave.jiang@intel.com> > > Cc: Alison Schofield <alison.schofield@intel.com> > > Cc: Vishal Verma <vishal.l.verma@intel.com> > > Cc: Ira Weiny <ira.weiny@intel.com> > > Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> > > Reviewed-by: Dave Jiang <dave.jiang@intel.com> > > Signed-off-by: Dan Williams <dan.j.williams@intel.com> > > --- > > drivers/cxl/core/region.c | 24 ++++++++++++++++++------ > > 1 file changed, 18 insertions(+), 6 deletions(-) > > > > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > > index 3a77aec2c447..2a97fa9a394f 100644 > > --- a/drivers/cxl/core/region.c > > +++ b/drivers/cxl/core/region.c > > @@ -3572,9 +3572,8 @@ static void shutdown_notifiers(void *_cxlr) > > unregister_mt_adistance_algorithm(&cxlr->adist_notifier); > > } > > > > -static int cxl_region_probe(struct device *dev) > > +static int cxl_region_can_probe(struct cxl_region *cxlr) > > { > > - struct cxl_region *cxlr = to_cxl_region(dev); > > struct cxl_region_params *p = &cxlr->params; > > int rc; > > > > @@ -3597,15 +3596,28 @@ static int cxl_region_probe(struct device *dev) > > goto out; > > } > > > > - /* > > - * From this point on any path that changes the region's state away from > > - * CXL_CONFIG_COMMIT is also responsible for releasing the driver. > > - */ > > out: > > up_read(&cxl_region_rwsem); > > > > if (rc) > > return rc; > > + return 0; > > This is an odd bit of code now. Why not just > > return rc; > > Ah. Patch 8 drops the if (rc) return rc bit. It was an artifact of how it was developed. I am inclined to let it be unless something else major comes up.
On Saturday, July 12, 2025 1:49:30 AM Central European Summer Time Dan Williams wrote: > Rather than unlocking the region rwsem in the middle of cxl_region_probe() > create a helper for determining when the region is ready-to-probe. > > Cc: Davidlohr Bueso <dave@stgolabs.net> > Cc: Jonathan Cameron <jonathan.cameron@huawei.com> > Cc: Dave Jiang <dave.jiang@intel.com> > Cc: Alison Schofield <alison.schofield@intel.com> > Cc: Vishal Verma <vishal.l.verma@intel.com> > Cc: Ira Weiny <ira.weiny@intel.com> > Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> > Reviewed-by: Dave Jiang <dave.jiang@intel.com> > Signed-off-by: Dan Williams <dan.j.williams@intel.com> Reviewed-by: Fabio M. De Francesco <fabio.m.de.francesco@linux.intel.com> > --- > drivers/cxl/core/region.c | 24 ++++++++++++++++++------ > 1 file changed, 18 insertions(+), 6 deletions(-) > > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > index 3a77aec2c447..2a97fa9a394f 100644 > --- a/drivers/cxl/core/region.c > +++ b/drivers/cxl/core/region.c > @@ -3572,9 +3572,8 @@ static void shutdown_notifiers(void *_cxlr) > unregister_mt_adistance_algorithm(&cxlr->adist_notifier); > } > > -static int cxl_region_probe(struct device *dev) > +static int cxl_region_can_probe(struct cxl_region *cxlr) > { > - struct cxl_region *cxlr = to_cxl_region(dev); > struct cxl_region_params *p = &cxlr->params; > int rc; > > @@ -3597,15 +3596,28 @@ static int cxl_region_probe(struct device *dev) > goto out; > } > > - /* > - * From this point on any path that changes the region's state away from > - * CXL_CONFIG_COMMIT is also responsible for releasing the driver. > - */ > out: > up_read(&cxl_region_rwsem); > > if (rc) > return rc; > + return 0; > +} > + > +static int cxl_region_probe(struct device *dev) > +{ > + struct cxl_region *cxlr = to_cxl_region(dev); > + struct cxl_region_params *p = &cxlr->params; > + int rc; > + > + rc = cxl_region_can_probe(cxlr); > + if (rc) > + return rc; > + > + /* > + * From this point on any path that changes the region's state away from > + * CXL_CONFIG_COMMIT is also responsible for releasing the driver. > + */ > > cxlr->memory_notifier.notifier_call = cxl_region_perf_attrs_callback; > cxlr->memory_notifier.priority = CXL_CALLBACK_PRI; > -- > 2.50.0 > > >
© 2016 - 2025 Red Hat, Inc.