Lines Matching refs:ref
38 static unsigned long __percpu *percpu_count_ptr(struct percpu_ref *ref) in percpu_count_ptr() argument
41 (ref->percpu_count_ptr & ~__PERCPU_REF_ATOMIC_DEAD); in percpu_count_ptr()
58 int percpu_ref_init(struct percpu_ref *ref, percpu_ref_func_t *release, in percpu_ref_init() argument
65 ref->percpu_count_ptr = (unsigned long) in percpu_ref_init()
67 if (!ref->percpu_count_ptr) in percpu_ref_init()
70 ref->force_atomic = flags & PERCPU_REF_INIT_ATOMIC; in percpu_ref_init()
73 ref->percpu_count_ptr |= __PERCPU_REF_ATOMIC; in percpu_ref_init()
78 ref->percpu_count_ptr |= __PERCPU_REF_DEAD; in percpu_ref_init()
82 atomic_long_set(&ref->count, start_count); in percpu_ref_init()
84 ref->release = release; in percpu_ref_init()
99 void percpu_ref_exit(struct percpu_ref *ref) in percpu_ref_exit() argument
101 unsigned long __percpu *percpu_count = percpu_count_ptr(ref); in percpu_ref_exit()
105 ref->percpu_count_ptr = __PERCPU_REF_ATOMIC_DEAD; in percpu_ref_exit()
112 struct percpu_ref *ref = container_of(rcu, struct percpu_ref, rcu); in percpu_ref_call_confirm_rcu() local
114 ref->confirm_switch(ref); in percpu_ref_call_confirm_rcu()
115 ref->confirm_switch = NULL; in percpu_ref_call_confirm_rcu()
119 percpu_ref_put(ref); in percpu_ref_call_confirm_rcu()
124 struct percpu_ref *ref = container_of(rcu, struct percpu_ref, rcu); in percpu_ref_switch_to_atomic_rcu() local
125 unsigned long __percpu *percpu_count = percpu_count_ptr(ref); in percpu_ref_switch_to_atomic_rcu()
133 atomic_long_read(&ref->count), (long)count); in percpu_ref_switch_to_atomic_rcu()
147 atomic_long_add((long)count - PERCPU_COUNT_BIAS, &ref->count); in percpu_ref_switch_to_atomic_rcu()
149 WARN_ONCE(atomic_long_read(&ref->count) <= 0, in percpu_ref_switch_to_atomic_rcu()
151 ref->release, atomic_long_read(&ref->count)); in percpu_ref_switch_to_atomic_rcu()
157 static void percpu_ref_noop_confirm_switch(struct percpu_ref *ref) in percpu_ref_noop_confirm_switch() argument
161 static void __percpu_ref_switch_to_atomic(struct percpu_ref *ref, in __percpu_ref_switch_to_atomic() argument
164 if (!(ref->percpu_count_ptr & __PERCPU_REF_ATOMIC)) { in __percpu_ref_switch_to_atomic()
166 ref->percpu_count_ptr |= __PERCPU_REF_ATOMIC; in __percpu_ref_switch_to_atomic()
172 WARN_ON_ONCE(ref->confirm_switch); in __percpu_ref_switch_to_atomic()
173 ref->confirm_switch = in __percpu_ref_switch_to_atomic()
176 percpu_ref_get(ref); /* put after confirmation */ in __percpu_ref_switch_to_atomic()
177 call_rcu_sched(&ref->rcu, percpu_ref_switch_to_atomic_rcu); in __percpu_ref_switch_to_atomic()
186 wait_event(percpu_ref_switch_waitq, !ref->confirm_switch); in __percpu_ref_switch_to_atomic()
187 ref->confirm_switch = confirm_switch; in __percpu_ref_switch_to_atomic()
189 percpu_ref_get(ref); /* put after confirmation */ in __percpu_ref_switch_to_atomic()
190 call_rcu_sched(&ref->rcu, percpu_ref_call_confirm_rcu); in __percpu_ref_switch_to_atomic()
219 void percpu_ref_switch_to_atomic(struct percpu_ref *ref, in percpu_ref_switch_to_atomic() argument
222 ref->force_atomic = true; in percpu_ref_switch_to_atomic()
223 __percpu_ref_switch_to_atomic(ref, confirm_switch); in percpu_ref_switch_to_atomic()
226 static void __percpu_ref_switch_to_percpu(struct percpu_ref *ref) in __percpu_ref_switch_to_percpu() argument
228 unsigned long __percpu *percpu_count = percpu_count_ptr(ref); in __percpu_ref_switch_to_percpu()
233 if (!(ref->percpu_count_ptr & __PERCPU_REF_ATOMIC)) in __percpu_ref_switch_to_percpu()
236 wait_event(percpu_ref_switch_waitq, !ref->confirm_switch); in __percpu_ref_switch_to_percpu()
238 atomic_long_add(PERCPU_COUNT_BIAS, &ref->count); in __percpu_ref_switch_to_percpu()
249 smp_store_release(&ref->percpu_count_ptr, in __percpu_ref_switch_to_percpu()
250 ref->percpu_count_ptr & ~__PERCPU_REF_ATOMIC); in __percpu_ref_switch_to_percpu()
271 void percpu_ref_switch_to_percpu(struct percpu_ref *ref) in percpu_ref_switch_to_percpu() argument
273 ref->force_atomic = false; in percpu_ref_switch_to_percpu()
276 if (!(ref->percpu_count_ptr & __PERCPU_REF_DEAD)) in percpu_ref_switch_to_percpu()
277 __percpu_ref_switch_to_percpu(ref); in percpu_ref_switch_to_percpu()
299 void percpu_ref_kill_and_confirm(struct percpu_ref *ref, in percpu_ref_kill_and_confirm() argument
302 WARN_ONCE(ref->percpu_count_ptr & __PERCPU_REF_DEAD, in percpu_ref_kill_and_confirm()
303 "%s called more than once on %pf!", __func__, ref->release); in percpu_ref_kill_and_confirm()
305 ref->percpu_count_ptr |= __PERCPU_REF_DEAD; in percpu_ref_kill_and_confirm()
306 __percpu_ref_switch_to_atomic(ref, confirm_kill); in percpu_ref_kill_and_confirm()
307 percpu_ref_put(ref); in percpu_ref_kill_and_confirm()
322 void percpu_ref_reinit(struct percpu_ref *ref) in percpu_ref_reinit() argument
324 WARN_ON_ONCE(!percpu_ref_is_zero(ref)); in percpu_ref_reinit()
326 ref->percpu_count_ptr &= ~__PERCPU_REF_DEAD; in percpu_ref_reinit()
327 percpu_ref_get(ref); in percpu_ref_reinit()
328 if (!ref->force_atomic) in percpu_ref_reinit()
329 __percpu_ref_switch_to_percpu(ref); in percpu_ref_reinit()