percpu_ref: add PERCPU_REF_INIT_* flags
With the recent addition of percpu_ref_reinit(), percpu_ref now can be used as a persistent switch which can be turned on and off repeatedly where turning off maps to killing the ref and waiting for it to drain; however, there currently isn't a way to initialize a percpu_ref in its off (killed and drained) state, which can be inconvenient for certain persistent switch use cases. Similarly, percpu_ref_switch_to_atomic/percpu() allow dynamic selection of operation mode; however, currently a newly initialized percpu_ref is always in percpu mode making it impossible to avoid the latency overhead of switching to atomic mode. This patch adds @flags to percpu_ref_init() and implements the following flags. * PERCPU_REF_INIT_ATOMIC : start ref in atomic mode * PERCPU_REF_INIT_DEAD : start ref killed and drained These flags should be able to serve the above two use cases. v2: target_core_tpg.c conversion was missing. Fixed. Signed-off-by: Tejun Heo <tj@kernel.org> Reviewed-by: Kent Overstreet <kmo@daterainc.com> Cc: Jens Axboe <axboe@kernel.dk> Cc: Christoph Hellwig <hch@infradead.org> Cc: Johannes Weiner <hannes@cmpxchg.org>
This commit is contained in:
parent
f47ad45784
commit
2aad2a86f6
6 changed files with 43 additions and 13 deletions
|
@ -1634,7 +1634,8 @@ static int cgroup_setup_root(struct cgroup_root *root, unsigned int ss_mask)
|
|||
goto out;
|
||||
root_cgrp->id = ret;
|
||||
|
||||
ret = percpu_ref_init(&root_cgrp->self.refcnt, css_release, GFP_KERNEL);
|
||||
ret = percpu_ref_init(&root_cgrp->self.refcnt, css_release, 0,
|
||||
GFP_KERNEL);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
|
@ -4510,7 +4511,7 @@ static int create_css(struct cgroup *cgrp, struct cgroup_subsys *ss,
|
|||
|
||||
init_and_link_css(css, ss, cgrp);
|
||||
|
||||
err = percpu_ref_init(&css->refcnt, css_release, GFP_KERNEL);
|
||||
err = percpu_ref_init(&css->refcnt, css_release, 0, GFP_KERNEL);
|
||||
if (err)
|
||||
goto err_free_css;
|
||||
|
||||
|
@ -4583,7 +4584,7 @@ static int cgroup_mkdir(struct kernfs_node *parent_kn, const char *name,
|
|||
goto out_unlock;
|
||||
}
|
||||
|
||||
ret = percpu_ref_init(&cgrp->self.refcnt, css_release, GFP_KERNEL);
|
||||
ret = percpu_ref_init(&cgrp->self.refcnt, css_release, 0, GFP_KERNEL);
|
||||
if (ret)
|
||||
goto out_free_cgrp;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue