Message ID | 168592157031.1948938.2150827780624190474.stgit@dwillia2-xfh.jf.intel.com |
---|---|
State | New, archived |
Headers | show |
Series | cxl: Device memory setup | expand |
On Sun, 04 Jun 2023 16:32:50 -0700 Dan Williams <dan.j.williams@intel.com> wrote: > In preparation for kernel driven region creation, factor out a common > helper from the user-sysfs region setup for interleave_granularity. > > Signed-off-by: Dan Williams <dan.j.williams@intel.com> One trivial thing inline. Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> > @@ -444,16 +437,30 @@ static ssize_t interleave_granularity_store(struct device *dev, > if (cxld->interleave_ways > 1 && val != cxld->interleave_granularity) > return -EINVAL; > > + lockdep_assert_held_write(&cxl_region_rwsem); > + if (p->state >= CXL_CONFIG_INTERLEAVE_ACTIVE) > + return -EBUSY; > + > + p->interleave_granularity = val; Trivial: Blank line here would be a tiny bit nicer to read. > + return 0; > +} > + >
On 6/4/23 16:32, Dan Williams wrote: > In preparation for kernel driven region creation, factor out a common > helper from the user-sysfs region setup for interleave_granularity. > > Signed-off-by: Dan Williams <dan.j.williams@intel.com> Reviewed-by: Dave Jiang <dave.jiang@intel.com> > --- > drivers/cxl/core/region.c | 39 +++++++++++++++++++++++---------------- > 1 file changed, 23 insertions(+), 16 deletions(-) > > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > index 821c2d90154f..4d8dbfedd64a 100644 > --- a/drivers/cxl/core/region.c > +++ b/drivers/cxl/core/region.c > @@ -414,21 +414,14 @@ static ssize_t interleave_granularity_show(struct device *dev, > return rc; > } > > -static ssize_t interleave_granularity_store(struct device *dev, > - struct device_attribute *attr, > - const char *buf, size_t len) > +static int set_interleave_granularity(struct cxl_region *cxlr, int val) > { > - struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev->parent); > + struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(cxlr->dev.parent); > struct cxl_decoder *cxld = &cxlrd->cxlsd.cxld; > - struct cxl_region *cxlr = to_cxl_region(dev); > struct cxl_region_params *p = &cxlr->params; > - int rc, val; > + int rc; > u16 ig; > > - rc = kstrtoint(buf, 0, &val); > - if (rc) > - return rc; > - > rc = granularity_to_eig(val, &ig); > if (rc) > return rc; > @@ -444,16 +437,30 @@ static ssize_t interleave_granularity_store(struct device *dev, > if (cxld->interleave_ways > 1 && val != cxld->interleave_granularity) > return -EINVAL; > > + lockdep_assert_held_write(&cxl_region_rwsem); > + if (p->state >= CXL_CONFIG_INTERLEAVE_ACTIVE) > + return -EBUSY; > + > + p->interleave_granularity = val; > + return 0; > +} > + > +static ssize_t interleave_granularity_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, size_t len) > +{ > + struct cxl_region *cxlr = to_cxl_region(dev); > + int rc, val; > + > + rc = kstrtoint(buf, 0, &val); > + if (rc) > + return rc; > + > rc = down_write_killable(&cxl_region_rwsem); > if (rc) > return rc; > - if (p->state >= CXL_CONFIG_INTERLEAVE_ACTIVE) { > - rc = -EBUSY; > - goto out; > - } > > - p->interleave_granularity = val; > -out: > + rc = set_interleave_granularity(cxlr, val); > up_write(&cxl_region_rwsem); > if (rc) > return rc; >
diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 821c2d90154f..4d8dbfedd64a 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -414,21 +414,14 @@ static ssize_t interleave_granularity_show(struct device *dev, return rc; } -static ssize_t interleave_granularity_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) +static int set_interleave_granularity(struct cxl_region *cxlr, int val) { - struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev->parent); + struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(cxlr->dev.parent); struct cxl_decoder *cxld = &cxlrd->cxlsd.cxld; - struct cxl_region *cxlr = to_cxl_region(dev); struct cxl_region_params *p = &cxlr->params; - int rc, val; + int rc; u16 ig; - rc = kstrtoint(buf, 0, &val); - if (rc) - return rc; - rc = granularity_to_eig(val, &ig); if (rc) return rc; @@ -444,16 +437,30 @@ static ssize_t interleave_granularity_store(struct device *dev, if (cxld->interleave_ways > 1 && val != cxld->interleave_granularity) return -EINVAL; + lockdep_assert_held_write(&cxl_region_rwsem); + if (p->state >= CXL_CONFIG_INTERLEAVE_ACTIVE) + return -EBUSY; + + p->interleave_granularity = val; + return 0; +} + +static ssize_t interleave_granularity_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct cxl_region *cxlr = to_cxl_region(dev); + int rc, val; + + rc = kstrtoint(buf, 0, &val); + if (rc) + return rc; + rc = down_write_killable(&cxl_region_rwsem); if (rc) return rc; - if (p->state >= CXL_CONFIG_INTERLEAVE_ACTIVE) { - rc = -EBUSY; - goto out; - } - p->interleave_granularity = val; -out: + rc = set_interleave_granularity(cxlr, val); up_write(&cxl_region_rwsem); if (rc) return rc;
In preparation for kernel driven region creation, factor out a common helper from the user-sysfs region setup for interleave_granularity. Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- drivers/cxl/core/region.c | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-)