Messages in this thread Patch in this message | | | From | Vladimir Davydov <> | Subject | [PATCH RFC 2/3] percpu-refcount: allow to get dead reference | Date | Tue, 13 May 2014 17:48:52 +0400 |
| |
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@parallels.com> --- 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
| |