Message ID | 20200927062654.2750277-2-ming.lei@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | percpu_ref & block: reduce memory footprint of percpu_ref in fast path | expand |
On Sun, Sep 27, 2020 at 02:26:52PM +0800, Ming Lei wrote: > MD code uses perpcu-refcount internal to check if this percpu-refcount > variable is initialized, this way is a hack. > > Add percpu_ref_is_initialized for MD so that the hack can be avoided. > > Acked-by: Song Liu <song@kernel.org> > Suggested-by: Jens Axboe <axboe@kernel.dk> > Tested-by: Veronika Kabatova <vkabatov@redhat.com> > Cc: Song Liu <song@kernel.org> > Cc: linux-raid@vger.kernel.org > Cc: Sagi Grimberg <sagi@grimberg.me> > Cc: Tejun Heo <tj@kernel.org> > Cc: Christoph Hellwig <hch@lst.de> > Cc: Jens Axboe <axboe@kernel.dk> > Cc: Bart Van Assche <bvanassche@acm.org> > Signed-off-by: Ming Lei <ming.lei@redhat.com> > --- > drivers/md/md.c | 2 +- > include/linux/percpu-refcount.h | 1 + > lib/percpu-refcount.c | 6 ++++++ > 3 files changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/md/md.c b/drivers/md/md.c > index de8419b7ae98..241ff618d84e 100644 > --- a/drivers/md/md.c > +++ b/drivers/md/md.c > @@ -5631,7 +5631,7 @@ static void no_op(struct percpu_ref *r) {} > > int mddev_init_writes_pending(struct mddev *mddev) > { > - if (mddev->writes_pending.percpu_count_ptr) > + if (percpu_ref_is_initialized(&mddev->writes_pending)) > return 0; I'd much rather use a flag in the containing mddev structure then exposing this new "API". That mddev code is pretty gross to be honest, we should just initialize the percpu_ref once instea of such a hack.
diff --git a/drivers/md/md.c b/drivers/md/md.c index de8419b7ae98..241ff618d84e 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -5631,7 +5631,7 @@ static void no_op(struct percpu_ref *r) {} int mddev_init_writes_pending(struct mddev *mddev) { - if (mddev->writes_pending.percpu_count_ptr) + if (percpu_ref_is_initialized(&mddev->writes_pending)) return 0; if (percpu_ref_init(&mddev->writes_pending, no_op, PERCPU_REF_ALLOW_REINIT, GFP_KERNEL) < 0) diff --git a/include/linux/percpu-refcount.h b/include/linux/percpu-refcount.h index 87d8a38bdea1..2dfdf870f2d0 100644 --- a/include/linux/percpu-refcount.h +++ b/include/linux/percpu-refcount.h @@ -109,6 +109,7 @@ struct percpu_ref { int __must_check percpu_ref_init(struct percpu_ref *ref, percpu_ref_func_t *release, unsigned int flags, gfp_t gfp); +bool percpu_ref_is_initialized(struct percpu_ref *ref); void percpu_ref_exit(struct percpu_ref *ref); void percpu_ref_switch_to_atomic(struct percpu_ref *ref, percpu_ref_func_t *confirm_switch); diff --git a/lib/percpu-refcount.c b/lib/percpu-refcount.c index 0ba686b8fe57..db2ec682e0f7 100644 --- a/lib/percpu-refcount.c +++ b/lib/percpu-refcount.c @@ -93,6 +93,12 @@ int percpu_ref_init(struct percpu_ref *ref, percpu_ref_func_t *release, } EXPORT_SYMBOL_GPL(percpu_ref_init); +bool percpu_ref_is_initialized(struct percpu_ref *ref) +{ + return percpu_count_ptr(ref) != NULL; +} +EXPORT_SYMBOL_GPL(percpu_ref_is_initialized); + /** * percpu_ref_exit - undo percpu_ref_init() * @ref: percpu_ref to exit