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:
@@ -63,6 +63,21 @@ enum {
|
||||
__PERCPU_REF_FLAG_BITS = 2,
|
||||
};
|
||||
|
||||
/* @flags for percpu_ref_init() */
|
||||
enum {
|
||||
/*
|
||||
* Start w/ ref == 1 in atomic mode. Can be switched to percpu
|
||||
* operation using percpu_ref_switch_to_percpu().
|
||||
*/
|
||||
PERCPU_REF_INIT_ATOMIC = 1 << 0,
|
||||
|
||||
/*
|
||||
* Start dead w/ ref == 0 in atomic mode. Must be revived with
|
||||
* percpu_ref_reinit() before used. Implies INIT_ATOMIC.
|
||||
*/
|
||||
PERCPU_REF_INIT_DEAD = 1 << 1,
|
||||
};
|
||||
|
||||
struct percpu_ref {
|
||||
atomic_long_t count;
|
||||
/*
|
||||
@@ -76,7 +91,8 @@ struct percpu_ref {
|
||||
};
|
||||
|
||||
int __must_check percpu_ref_init(struct percpu_ref *ref,
|
||||
percpu_ref_func_t *release, gfp_t gfp);
|
||||
percpu_ref_func_t *release, unsigned int flags,
|
||||
gfp_t gfp);
|
||||
void percpu_ref_exit(struct percpu_ref *ref);
|
||||
void percpu_ref_switch_to_atomic(struct percpu_ref *ref,
|
||||
percpu_ref_func_t *confirm_switch);
|
||||
|
Reference in New Issue
Block a user