Currently percpu_ref_tryget fails after percpu_ref_kill is called, even if refcnt != 0. In the next patch I need a method to get a ref that will only fail if refcnt == 0, so let's extend the interface to percpu ref a bit to allow that. Signed-off-by: Vladimir Davydov <vdavydov@xxxxxxxxxxxxx> --- include/linux/percpu-refcount.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/include/linux/percpu-refcount.h b/include/linux/percpu-refcount.h index 95961f0bf62d..7729e59b9cb7 100644 --- a/include/linux/percpu-refcount.h +++ b/include/linux/percpu-refcount.h @@ -129,7 +129,8 @@ static inline void percpu_ref_get(struct percpu_ref *ref) * used. After the confirm_kill callback is invoked, it's guaranteed that * no new reference will be given out by percpu_ref_tryget(). */ -static inline bool percpu_ref_tryget(struct percpu_ref *ref) +static inline bool __percpu_ref_tryget(struct percpu_ref *ref, + bool maybe_dead) { unsigned __percpu *pcpu_count; int ret = false; @@ -141,13 +142,19 @@ static inline bool percpu_ref_tryget(struct percpu_ref *ref) if (likely(REF_STATUS(pcpu_count) == PCPU_REF_PTR)) { __this_cpu_inc(*pcpu_count); ret = true; - } + } else if (maybe_dead && unlikely(atomic_read(&ref->count))) + ret = atomic_inc_not_zero(&ref->count); rcu_read_unlock_sched(); return ret; } +static inline bool percpu_ref_tryget(struct percpu_ref *ref) +{ + return __percpu_ref_tryget(ref, false); +} + /** * percpu_ref_put - decrement a percpu refcount * @ref: percpu_ref to put -- 1.7.10.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>