* [PATCH 0/2] Add cond_guard() to conditional guards
@ 2024-02-04 17:31 Fabio M. De Francesco
2024-02-04 17:31 ` [PATCH 1/2] cleanup: " Fabio M. De Francesco
` (2 more replies)
0 siblings, 3 replies; 9+ messages in thread
From: Fabio M. De Francesco @ 2024-02-04 17:31 UTC (permalink / raw)
To: Peter Zijlstra, Dan Williams, linux-kernel
Cc: Ingo Molnar, linux-cxl, Fabio M. De Francesco, Ira Weiny
Add cond_guard() macro to conditional guards and use it to replace an
open-coded up_read() in show_targetN().
Cc: Peter Zijlstra <peterz@infradead.org>
Suggested-by: Dan Williams <dan.j.williams@intel.com>
Suggested-by: Ira Weiny <ira.weiny@intel.com>
Fabio M. De Francesco (2):
cleanup: Add cond_guard() to conditional guards
cxl/region: Use cond_guard() in show_targetN()
drivers/cxl/core/region.c | 16 ++++------------
include/linux/cleanup.h | 14 ++++++++++++++
2 files changed, 18 insertions(+), 12 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 1/2] cleanup: Add cond_guard() to conditional guards 2024-02-04 17:31 [PATCH 0/2] Add cond_guard() to conditional guards Fabio M. De Francesco @ 2024-02-04 17:31 ` Fabio M. De Francesco 2024-02-05 11:09 ` Jonathan Cameron ` (2 more replies) 2024-02-04 17:31 ` [PATCH 2/2] cxl/region: Use cond_guard() in show_targetN() Fabio M. De Francesco 2024-02-05 10:56 ` [PATCH 0/2] Add cond_guard() to conditional guards Jonathan Cameron 2 siblings, 3 replies; 9+ messages in thread From: Fabio M. De Francesco @ 2024-02-04 17:31 UTC (permalink / raw) To: Peter Zijlstra, Dan Williams, linux-kernel Cc: Ingo Molnar, linux-cxl, Fabio M. De Francesco, Ira Weiny Add cond_guard() macro to conditional guards. cond_guard() is a guard to be used with the conditional variants of locks, like down_read_trylock() or mutex_lock_interruptible(). It takes a statement (or more statements in a block) that is passed to its second argument. That statement (or block) is executed if waiting for a lock is interrupted or if a _trylock() fails in case of contention. Usage example: cond_guard(rwsem_read_try, { printk(...); return 0; }, &semaphore); Consistenly with the other guards, locks are unlocked at the exit of the scope where cond_guard() is called. Cc: Peter Zijlstra <peterz@infradead.org> Suggested-by: Dan Williams <dan.j.williams@intel.com> Suggested-by: Ira Weiny <ira.weiny@intel.com> Signed-off-by: Fabio M. De Francesco <fabio.maria.de.francesco@linux.intel.com> --- include/linux/cleanup.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/linux/cleanup.h b/include/linux/cleanup.h index c2d09bc4f976..3826e8ed4e09 100644 --- a/include/linux/cleanup.h +++ b/include/linux/cleanup.h @@ -134,6 +134,16 @@ static inline class_##_name##_t class_##_name##ext##_constructor(_init_args) \ * an anonymous instance of the (guard) class, not recommended for * conditional locks. * + * cond_guard(name, fail, args...): + * a guard to be used with the conditional variants of locks, like + * down_read_trylock() or mutex_lock_interruptible. 'fail' are one or more + * statements that are executed if waiting for a lock is interrupted or + * if a _trylock() fails in case of contention. + * + * Example: + * + * cond_guard(rwsem_read_try, { printk(...); return 0; }, &semaphore); + * * scoped_guard (name, args...) { }: * similar to CLASS(name, scope)(args), except the variable (with the * explicit name 'scope') is declard in a for-loop such that its scope is @@ -165,6 +175,10 @@ static inline class_##_name##_t class_##_name##ext##_constructor(_init_args) \ #define __guard_ptr(_name) class_##_name##_lock_ptr +#define cond_guard(_name, _ret, args...) \ + CLASS(_name, scope)(args); \ + if (!__guard_ptr(_name)(&scope)) _ret + #define scoped_guard(_name, args...) \ for (CLASS(_name, scope)(args), \ *done = NULL; __guard_ptr(_name)(&scope) && !done; done = (void *)1) -- 2.43.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] cleanup: Add cond_guard() to conditional guards 2024-02-04 17:31 ` [PATCH 1/2] cleanup: " Fabio M. De Francesco @ 2024-02-05 11:09 ` Jonathan Cameron 2024-02-05 17:04 ` Ira Weiny 2024-02-05 19:13 ` Dan Williams 2 siblings, 0 replies; 9+ messages in thread From: Jonathan Cameron @ 2024-02-05 11:09 UTC (permalink / raw) To: Fabio M. De Francesco Cc: Peter Zijlstra, Dan Williams, linux-kernel, Ingo Molnar, linux-cxl, Ira Weiny On Sun, 4 Feb 2024 18:31:04 +0100 "Fabio M. De Francesco" <fabio.maria.de.francesco@linux.intel.com> wrote: > Add cond_guard() macro to conditional guards. > > cond_guard() is a guard to be used with the conditional variants of locks, > like down_read_trylock() or mutex_lock_interruptible(). > > It takes a statement (or more statements in a block) that is passed to its > second argument. That statement (or block) is executed if waiting for a > lock is interrupted or if a _trylock() fails in case of contention. > > Usage example: > > cond_guard(rwsem_read_try, { printk(...); return 0; }, &semaphore); > > Consistenly with the other guards, locks are unlocked at the exit of the Spell check. > scope where cond_guard() is called. > > Cc: Peter Zijlstra <peterz@infradead.org> > Suggested-by: Dan Williams <dan.j.williams@intel.com> > Suggested-by: Ira Weiny <ira.weiny@intel.com> > Signed-off-by: Fabio M. De Francesco <fabio.maria.de.francesco@linux.intel.com> > --- > include/linux/cleanup.h | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/include/linux/cleanup.h b/include/linux/cleanup.h > index c2d09bc4f976..3826e8ed4e09 100644 > --- a/include/linux/cleanup.h > +++ b/include/linux/cleanup.h > @@ -134,6 +134,16 @@ static inline class_##_name##_t class_##_name##ext##_constructor(_init_args) \ > * an anonymous instance of the (guard) class, not recommended for > * conditional locks. > * > + * cond_guard(name, fail, args...): > + * a guard to be used with the conditional variants of locks, like > + * down_read_trylock() or mutex_lock_interruptible. 'fail' are one or more > + * statements that are executed if waiting for a lock is interrupted or > + * if a _trylock() fails in case of contention. > + * > + * Example: > + * > + * cond_guard(rwsem_read_try, { printk(...); return 0; }, &semaphore); > + * > * scoped_guard (name, args...) { }: > * similar to CLASS(name, scope)(args), except the variable (with the > * explicit name 'scope') is declard in a for-loop such that its scope is > @@ -165,6 +175,10 @@ static inline class_##_name##_t class_##_name##ext##_constructor(_init_args) \ > > #define __guard_ptr(_name) class_##_name##_lock_ptr > > +#define cond_guard(_name, _ret, args...) \ > + CLASS(_name, scope)(args); \ > + if (!__guard_ptr(_name)(&scope)) _ret Use the naming that scoped_cond_guard() uses: _fail rather than _ret > + > #define scoped_guard(_name, args...) \ > for (CLASS(_name, scope)(args), \ > *done = NULL; __guard_ptr(_name)(&scope) && !done; done = (void *)1) ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] cleanup: Add cond_guard() to conditional guards 2024-02-04 17:31 ` [PATCH 1/2] cleanup: " Fabio M. De Francesco 2024-02-05 11:09 ` Jonathan Cameron @ 2024-02-05 17:04 ` Ira Weiny 2024-02-05 19:13 ` Dan Williams 2 siblings, 0 replies; 9+ messages in thread From: Ira Weiny @ 2024-02-05 17:04 UTC (permalink / raw) To: Fabio M. De Francesco, Peter Zijlstra, Dan Williams, linux-kernel Cc: Ingo Molnar, linux-cxl, Fabio M. De Francesco, Ira Weiny Fabio M. De Francesco wrote: > Add cond_guard() macro to conditional guards. > > cond_guard() is a guard to be used with the conditional variants of locks, > like down_read_trylock() or mutex_lock_interruptible(). > > It takes a statement (or more statements in a block) that is passed to its > second argument. That statement (or block) is executed if waiting for a > lock is interrupted or if a _trylock() fails in case of contention. > > Usage example: > > cond_guard(rwsem_read_try, { printk(...); return 0; }, &semaphore); > > Consistenly with the other guards, locks are unlocked at the exit of the Consistently Reviewed-by: Ira Weiny <ira.weiny@intel.com> > scope where cond_guard() is called. > > Cc: Peter Zijlstra <peterz@infradead.org> > Suggested-by: Dan Williams <dan.j.williams@intel.com> > Suggested-by: Ira Weiny <ira.weiny@intel.com> > Signed-off-by: Fabio M. De Francesco <fabio.maria.de.francesco@linux.intel.com> > --- > include/linux/cleanup.h | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/include/linux/cleanup.h b/include/linux/cleanup.h > index c2d09bc4f976..3826e8ed4e09 100644 > --- a/include/linux/cleanup.h > +++ b/include/linux/cleanup.h > @@ -134,6 +134,16 @@ static inline class_##_name##_t class_##_name##ext##_constructor(_init_args) \ > * an anonymous instance of the (guard) class, not recommended for > * conditional locks. > * > + * cond_guard(name, fail, args...): > + * a guard to be used with the conditional variants of locks, like > + * down_read_trylock() or mutex_lock_interruptible. 'fail' are one or more > + * statements that are executed if waiting for a lock is interrupted or > + * if a _trylock() fails in case of contention. > + * > + * Example: > + * > + * cond_guard(rwsem_read_try, { printk(...); return 0; }, &semaphore); > + * > * scoped_guard (name, args...) { }: > * similar to CLASS(name, scope)(args), except the variable (with the > * explicit name 'scope') is declard in a for-loop such that its scope is > @@ -165,6 +175,10 @@ static inline class_##_name##_t class_##_name##ext##_constructor(_init_args) \ > > #define __guard_ptr(_name) class_##_name##_lock_ptr > > +#define cond_guard(_name, _ret, args...) \ > + CLASS(_name, scope)(args); \ > + if (!__guard_ptr(_name)(&scope)) _ret > + > #define scoped_guard(_name, args...) \ > for (CLASS(_name, scope)(args), \ > *done = NULL; __guard_ptr(_name)(&scope) && !done; done = (void *)1) > -- > 2.43.0 > ^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: [PATCH 1/2] cleanup: Add cond_guard() to conditional guards 2024-02-04 17:31 ` [PATCH 1/2] cleanup: " Fabio M. De Francesco 2024-02-05 11:09 ` Jonathan Cameron 2024-02-05 17:04 ` Ira Weiny @ 2024-02-05 19:13 ` Dan Williams 2 siblings, 0 replies; 9+ messages in thread From: Dan Williams @ 2024-02-05 19:13 UTC (permalink / raw) To: Fabio M. De Francesco, Peter Zijlstra, Dan Williams, linux-kernel Cc: Ingo Molnar, linux-cxl, Fabio M. De Francesco, Ira Weiny Fabio M. De Francesco wrote: > Add cond_guard() macro to conditional guards. > > cond_guard() is a guard to be used with the conditional variants of locks, > like down_read_trylock() or mutex_lock_interruptible(). > > It takes a statement (or more statements in a block) that is passed to its s/or more statements in a block/or statement-expression)/ s/to its/as its/ > second argument. That statement (or block) is executed if waiting for a > lock is interrupted or if a _trylock() fails in case of contention. > > Usage example: > > cond_guard(rwsem_read_try, { printk(...); return 0; }, &semaphore); Missed commenting on this in the last posting, but multi-statement fail cases that print and return 0 are unlikely to ever be the common case. I think the most simple to understand example is an interruptible lock that returns -EINTR on failure: cond_guard(mutex_intr, return -EINTR, &mutex); ...and then maybe mention that _fail can be a statement-expression if needed. > Consistenly with the other guards, locks are unlocked at the exit of the s/Consistenly with the other guards/Consistent with other usage of guard()/ ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/2] cxl/region: Use cond_guard() in show_targetN() 2024-02-04 17:31 [PATCH 0/2] Add cond_guard() to conditional guards Fabio M. De Francesco 2024-02-04 17:31 ` [PATCH 1/2] cleanup: " Fabio M. De Francesco @ 2024-02-04 17:31 ` Fabio M. De Francesco 2024-02-05 11:11 ` Jonathan Cameron 2024-02-05 17:06 ` Ira Weiny 2024-02-05 10:56 ` [PATCH 0/2] Add cond_guard() to conditional guards Jonathan Cameron 2 siblings, 2 replies; 9+ messages in thread From: Fabio M. De Francesco @ 2024-02-04 17:31 UTC (permalink / raw) To: Peter Zijlstra, Dan Williams, linux-kernel Cc: Ingo Molnar, linux-cxl, Fabio M. De Francesco, Ira Weiny Use cond_guard() in show_target() to not open code an up_read() in an 'out' block. If the down_read_interruptible() fails, the statement passed to the second argument of cond_guard() returns -EINTR. Cc: Peter Zijlstra <peterz@infradead.org> Suggested-by: Dan Williams <dan.j.williams@intel.com> Suggested-by: Ira Weiny <ira.weiny@intel.com> Signed-off-by: Fabio M. De Francesco <fabio.maria.de.francesco@linux.intel.com> --- drivers/cxl/core/region.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c index 0f05692bfec3..bd3236786a25 100644 --- a/drivers/cxl/core/region.c +++ b/drivers/cxl/core/region.c @@ -666,28 +666,20 @@ static size_t show_targetN(struct cxl_region *cxlr, char *buf, int pos) { struct cxl_region_params *p = &cxlr->params; struct cxl_endpoint_decoder *cxled; - int rc; - rc = down_read_interruptible(&cxl_region_rwsem); - if (rc) - return rc; + cond_guard(rwsem_read_intr, return -EINTR, &cxl_region_rwsem); if (pos >= p->interleave_ways) { dev_dbg(&cxlr->dev, "position %d out of range %d\n", pos, p->interleave_ways); - rc = -ENXIO; - goto out; + return -ENXIO; } cxled = p->targets[pos]; if (!cxled) - rc = sysfs_emit(buf, "\n"); + return sysfs_emit(buf, "\n"); else - rc = sysfs_emit(buf, "%s\n", dev_name(&cxled->cxld.dev)); -out: - up_read(&cxl_region_rwsem); - - return rc; + return sysfs_emit(buf, "%s\n", dev_name(&cxled->cxld.dev)); } static int match_free_decoder(struct device *dev, void *data) -- 2.43.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] cxl/region: Use cond_guard() in show_targetN() 2024-02-04 17:31 ` [PATCH 2/2] cxl/region: Use cond_guard() in show_targetN() Fabio M. De Francesco @ 2024-02-05 11:11 ` Jonathan Cameron 2024-02-05 17:06 ` Ira Weiny 1 sibling, 0 replies; 9+ messages in thread From: Jonathan Cameron @ 2024-02-05 11:11 UTC (permalink / raw) To: Fabio M. De Francesco Cc: Peter Zijlstra, Dan Williams, linux-kernel, Ingo Molnar, linux-cxl, Ira Weiny On Sun, 4 Feb 2024 18:31:05 +0100 "Fabio M. De Francesco" <fabio.maria.de.francesco@linux.intel.com> wrote: > Use cond_guard() in show_target() to not open code an up_read() in an 'out' > block. If the down_read_interruptible() fails, the statement passed to the > second argument of cond_guard() returns -EINTR. > > Cc: Peter Zijlstra <peterz@infradead.org> > Suggested-by: Dan Williams <dan.j.williams@intel.com> > Suggested-by: Ira Weiny <ira.weiny@intel.com> > Signed-off-by: Fabio M. De Francesco <fabio.maria.de.francesco@linux.intel.com> LGTM Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> > --- > drivers/cxl/core/region.c | 16 ++++------------ > 1 file changed, 4 insertions(+), 12 deletions(-) > > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > index 0f05692bfec3..bd3236786a25 100644 > --- a/drivers/cxl/core/region.c > +++ b/drivers/cxl/core/region.c > @@ -666,28 +666,20 @@ static size_t show_targetN(struct cxl_region *cxlr, char *buf, int pos) > { > struct cxl_region_params *p = &cxlr->params; > struct cxl_endpoint_decoder *cxled; > - int rc; > > - rc = down_read_interruptible(&cxl_region_rwsem); > - if (rc) > - return rc; > + cond_guard(rwsem_read_intr, return -EINTR, &cxl_region_rwsem); > > if (pos >= p->interleave_ways) { > dev_dbg(&cxlr->dev, "position %d out of range %d\n", pos, > p->interleave_ways); > - rc = -ENXIO; > - goto out; > + return -ENXIO; > } > > cxled = p->targets[pos]; > if (!cxled) > - rc = sysfs_emit(buf, "\n"); > + return sysfs_emit(buf, "\n"); > else > - rc = sysfs_emit(buf, "%s\n", dev_name(&cxled->cxld.dev)); > -out: > - up_read(&cxl_region_rwsem); > - > - return rc; > + return sysfs_emit(buf, "%s\n", dev_name(&cxled->cxld.dev)); > } > > static int match_free_decoder(struct device *dev, void *data) ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] cxl/region: Use cond_guard() in show_targetN() 2024-02-04 17:31 ` [PATCH 2/2] cxl/region: Use cond_guard() in show_targetN() Fabio M. De Francesco 2024-02-05 11:11 ` Jonathan Cameron @ 2024-02-05 17:06 ` Ira Weiny 1 sibling, 0 replies; 9+ messages in thread From: Ira Weiny @ 2024-02-05 17:06 UTC (permalink / raw) To: Fabio M. De Francesco, Peter Zijlstra, Dan Williams, linux-kernel Cc: Ingo Molnar, linux-cxl, Fabio M. De Francesco, Ira Weiny Fabio M. De Francesco wrote: > Use cond_guard() in show_target() to not open code an up_read() in an 'out' > block. If the down_read_interruptible() fails, the statement passed to the > second argument of cond_guard() returns -EINTR. > > Cc: Peter Zijlstra <peterz@infradead.org> > Suggested-by: Dan Williams <dan.j.williams@intel.com> > Suggested-by: Ira Weiny <ira.weiny@intel.com> > Signed-off-by: Fabio M. De Francesco <fabio.maria.de.francesco@linux.intel.com> > --- > drivers/cxl/core/region.c | 16 ++++------------ > 1 file changed, 4 insertions(+), 12 deletions(-) > > diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c > index 0f05692bfec3..bd3236786a25 100644 > --- a/drivers/cxl/core/region.c > +++ b/drivers/cxl/core/region.c > @@ -666,28 +666,20 @@ static size_t show_targetN(struct cxl_region *cxlr, char *buf, int pos) > { > struct cxl_region_params *p = &cxlr->params; > struct cxl_endpoint_decoder *cxled; > - int rc; > > - rc = down_read_interruptible(&cxl_region_rwsem); > - if (rc) > - return rc; > + cond_guard(rwsem_read_intr, return -EINTR, &cxl_region_rwsem); > > if (pos >= p->interleave_ways) { > dev_dbg(&cxlr->dev, "position %d out of range %d\n", pos, > p->interleave_ways); > - rc = -ENXIO; > - goto out; > + return -ENXIO; > } > > cxled = p->targets[pos]; > if (!cxled) > - rc = sysfs_emit(buf, "\n"); > + return sysfs_emit(buf, "\n"); > else NIT: This else is not needed anymore. Reviewed-by: Ira Weiny <ira.weiny@intel.com> > - rc = sysfs_emit(buf, "%s\n", dev_name(&cxled->cxld.dev)); > -out: > - up_read(&cxl_region_rwsem); > - > - return rc; > + return sysfs_emit(buf, "%s\n", dev_name(&cxled->cxld.dev)); > } > > static int match_free_decoder(struct device *dev, void *data) > -- > 2.43.0 > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 0/2] Add cond_guard() to conditional guards 2024-02-04 17:31 [PATCH 0/2] Add cond_guard() to conditional guards Fabio M. De Francesco 2024-02-04 17:31 ` [PATCH 1/2] cleanup: " Fabio M. De Francesco 2024-02-04 17:31 ` [PATCH 2/2] cxl/region: Use cond_guard() in show_targetN() Fabio M. De Francesco @ 2024-02-05 10:56 ` Jonathan Cameron 2 siblings, 0 replies; 9+ messages in thread From: Jonathan Cameron @ 2024-02-05 10:56 UTC (permalink / raw) To: Fabio M. De Francesco Cc: Peter Zijlstra, Dan Williams, linux-kernel, Ingo Molnar, linux-cxl, Ira Weiny On Sun, 4 Feb 2024 18:31:03 +0100 "Fabio M. De Francesco" <fabio.maria.de.francesco@linux.intel.com> wrote: > Add cond_guard() macro to conditional guards and use it to replace an > open-coded up_read() in show_targetN(). > > Cc: Peter Zijlstra <peterz@infradead.org> > Suggested-by: Dan Williams <dan.j.williams@intel.com> > Suggested-by: Ira Weiny <ira.weiny@intel.com> Change log since RFC v5? > > Fabio M. De Francesco (2): > cleanup: Add cond_guard() to conditional guards > cxl/region: Use cond_guard() in show_targetN() > > drivers/cxl/core/region.c | 16 ++++------------ > include/linux/cleanup.h | 14 ++++++++++++++ > 2 files changed, 18 insertions(+), 12 deletions(-) > ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2024-02-05 19:14 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-02-04 17:31 [PATCH 0/2] Add cond_guard() to conditional guards Fabio M. De Francesco 2024-02-04 17:31 ` [PATCH 1/2] cleanup: " Fabio M. De Francesco 2024-02-05 11:09 ` Jonathan Cameron 2024-02-05 17:04 ` Ira Weiny 2024-02-05 19:13 ` Dan Williams 2024-02-04 17:31 ` [PATCH 2/2] cxl/region: Use cond_guard() in show_targetN() Fabio M. De Francesco 2024-02-05 11:11 ` Jonathan Cameron 2024-02-05 17:06 ` Ira Weiny 2024-02-05 10:56 ` [PATCH 0/2] Add cond_guard() to conditional guards Jonathan Cameron
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox