diff options
author | Tejun Heo <tj@kernel.org> | 2014-06-28 08:10:14 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2014-06-28 08:10:14 -0400 |
commit | 9a1049da9bd2cd83fe11d46433e603c193aa9c71 (patch) | |
tree | 007d2843abf0f064c294659334e69e297ffc2b74 /fs/aio.c | |
parent | 7d742075120deb831c7b94c268ca20d409e91d60 (diff) |
percpu-refcount: require percpu_ref to be exited explicitly
Currently, a percpu_ref undoes percpu_ref_init() automatically by
freeing the allocated percpu area when the percpu_ref is killed.
While seemingly convenient, this has the following niggles.
* It's impossible to re-init a released reference counter without
going through re-allocation.
* In the similar vein, it's impossible to initialize a percpu_ref
count with static percpu variables.
* We need and have an explicit destructor anyway for failure paths -
percpu_ref_cancel_init().
This patch removes the automatic percpu counter freeing in
percpu_ref_kill_rcu() and repurposes percpu_ref_cancel_init() into a
generic destructor now named percpu_ref_exit(). percpu_ref_destroy()
is considered but it gets confusing with percpu_ref_kill() while
"exit" clearly indicates that it's the counterpart of
percpu_ref_init().
All percpu_ref_cancel_init() users are updated to invoke
percpu_ref_exit() instead and explicit percpu_ref_exit() calls are
added to the destruction path of all percpu_ref users.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Benjamin LaHaise <bcrl@kvack.org>
Cc: Kent Overstreet <kmo@daterainc.com>
Cc: Christoph Lameter <cl@linux-foundation.org>
Cc: Benjamin LaHaise <bcrl@kvack.org>
Cc: Nicholas A. Bellinger <nab@linux-iscsi.org>
Cc: Li Zefan <lizefan@huawei.com>
Diffstat (limited to 'fs/aio.c')
-rw-r--r-- | fs/aio.c | 6 |
1 files changed, 4 insertions, 2 deletions
@@ -506,6 +506,8 @@ static void free_ioctx(struct work_struct *work) | |||
506 | 506 | ||
507 | aio_free_ring(ctx); | 507 | aio_free_ring(ctx); |
508 | free_percpu(ctx->cpu); | 508 | free_percpu(ctx->cpu); |
509 | percpu_ref_exit(&ctx->reqs); | ||
510 | percpu_ref_exit(&ctx->users); | ||
509 | kmem_cache_free(kioctx_cachep, ctx); | 511 | kmem_cache_free(kioctx_cachep, ctx); |
510 | } | 512 | } |
511 | 513 | ||
@@ -715,8 +717,8 @@ err_ctx: | |||
715 | err: | 717 | err: |
716 | mutex_unlock(&ctx->ring_lock); | 718 | mutex_unlock(&ctx->ring_lock); |
717 | free_percpu(ctx->cpu); | 719 | free_percpu(ctx->cpu); |
718 | percpu_ref_cancel_init(&ctx->reqs); | 720 | percpu_ref_exit(&ctx->reqs); |
719 | percpu_ref_cancel_init(&ctx->users); | 721 | percpu_ref_exit(&ctx->users); |
720 | kmem_cache_free(kioctx_cachep, ctx); | 722 | kmem_cache_free(kioctx_cachep, ctx); |
721 | pr_debug("error allocating ioctx %d\n", err); | 723 | pr_debug("error allocating ioctx %d\n", err); |
722 | return ERR_PTR(err); | 724 | return ERR_PTR(err); |