mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-26 08:31:13 +00:00
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>
This commit is contained in:
parent
7d74207512
commit
9a1049da9b
5 changed files with 24 additions and 33 deletions
|
@ -1638,7 +1638,7 @@ destroy_root:
|
|||
exit_root_id:
|
||||
cgroup_exit_root_id(root);
|
||||
cancel_ref:
|
||||
percpu_ref_cancel_init(&root_cgrp->self.refcnt);
|
||||
percpu_ref_exit(&root_cgrp->self.refcnt);
|
||||
out:
|
||||
free_cgrp_cset_links(&tmp_links);
|
||||
return ret;
|
||||
|
@ -4133,6 +4133,8 @@ static void css_free_work_fn(struct work_struct *work)
|
|||
container_of(work, struct cgroup_subsys_state, destroy_work);
|
||||
struct cgroup *cgrp = css->cgroup;
|
||||
|
||||
percpu_ref_exit(&css->refcnt);
|
||||
|
||||
if (css->ss) {
|
||||
/* css free path */
|
||||
if (css->parent)
|
||||
|
@ -4330,7 +4332,7 @@ err_list_del:
|
|||
err_free_id:
|
||||
cgroup_idr_remove(&ss->css_idr, css->id);
|
||||
err_free_percpu_ref:
|
||||
percpu_ref_cancel_init(&css->refcnt);
|
||||
percpu_ref_exit(&css->refcnt);
|
||||
err_free_css:
|
||||
call_rcu(&css->rcu_head, css_free_rcu_fn);
|
||||
return err;
|
||||
|
@ -4441,7 +4443,7 @@ static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name,
|
|||
out_free_id:
|
||||
cgroup_idr_remove(&root->cgroup_idr, cgrp->id);
|
||||
out_cancel_ref:
|
||||
percpu_ref_cancel_init(&cgrp->self.refcnt);
|
||||
percpu_ref_exit(&cgrp->self.refcnt);
|
||||
out_free_cgrp:
|
||||
kfree(cgrp);
|
||||
out_unlock:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue