Block layer need to call this function after holding
rcu lock in a real hot path, so introduce this helper.

Cc: Bart Van Assche <[email protected]>
Cc: Tejun Heo <[email protected]>
Signed-off-by: Ming Lei <[email protected]>
---
 include/linux/percpu-refcount.h | 27 +++++++++++++++++----------
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/include/linux/percpu-refcount.h b/include/linux/percpu-refcount.h
index c13dceb87b60..a0f22586a28d 100644
--- a/include/linux/percpu-refcount.h
+++ b/include/linux/percpu-refcount.h
@@ -221,6 +221,21 @@ static inline bool percpu_ref_tryget(struct percpu_ref 
*ref)
        return ret;
 }
 
+static inline bool __percpu_ref_tryget_live(struct percpu_ref *ref)
+{
+       unsigned long __percpu *percpu_count;
+       bool ret = false;
+
+       if (__ref_is_percpu(ref, &percpu_count)) {
+               this_cpu_inc(*percpu_count);
+               ret = true;
+       } else if (!(ref->percpu_count_ptr & __PERCPU_REF_DEAD)) {
+               ret = atomic_long_inc_not_zero(&ref->count);
+       }
+
+       return ret;
+}
+
 /**
  * percpu_ref_tryget_live - try to increment a live percpu refcount
  * @ref: percpu_ref to try-get
@@ -238,18 +253,10 @@ static inline bool percpu_ref_tryget(struct percpu_ref 
*ref)
  */
 static inline bool percpu_ref_tryget_live(struct percpu_ref *ref)
 {
-       unsigned long __percpu *percpu_count;
-       bool ret = false;
+       bool ret;
 
        rcu_read_lock_sched();
-
-       if (__ref_is_percpu(ref, &percpu_count)) {
-               this_cpu_inc(*percpu_count);
-               ret = true;
-       } else if (!(ref->percpu_count_ptr & __PERCPU_REF_DEAD)) {
-               ret = atomic_long_inc_not_zero(&ref->count);
-       }
-
+       ret = __percpu_ref_tryget_live(ref);
        rcu_read_unlock_sched();
 
        return ret;
-- 
2.9.5

Reply via email to