percpu_count_ptr
unsigned long percpu_count_ptr;
percpu_ptr = READ_ONCE(ref->percpu_count_ptr);
} else if (!(ref->percpu_count_ptr & __PERCPU_REF_DEAD)) {
return ref->percpu_count_ptr & __PERCPU_REF_DEAD;
unsigned long __percpu *percpu_count = percpu_count_ptr(ref);
ref->percpu_count_ptr = __PERCPU_REF_ATOMIC_DEAD;
ref->percpu_count_ptr |= atomic_long_read(&ref->data->count) <<
unsigned long __percpu *percpu_count = percpu_count_ptr(ref);
if (ref->percpu_count_ptr & __PERCPU_REF_ATOMIC) {
ref->percpu_count_ptr |= __PERCPU_REF_ATOMIC;
unsigned long __percpu *percpu_count = percpu_count_ptr(ref);
if (!(ref->percpu_count_ptr & __PERCPU_REF_ATOMIC))
smp_store_release(&ref->percpu_count_ptr,
ref->percpu_count_ptr & ~__PERCPU_REF_ATOMIC);
ref->percpu_count_ptr |= __PERCPU_REF_DEAD;
count = ref->percpu_count_ptr >> __PERCPU_REF_FLAG_BITS;
(ref->percpu_count_ptr & ~__PERCPU_REF_ATOMIC_DEAD);
ref->percpu_count_ptr &= ~__PERCPU_REF_DEAD;
ref->percpu_count_ptr = (unsigned long)
if (!ref->percpu_count_ptr)
free_percpu((void __percpu *)ref->percpu_count_ptr);
ref->percpu_count_ptr = 0;
ref->percpu_count_ptr |= __PERCPU_REF_ATOMIC;
ref->percpu_count_ptr |= __PERCPU_REF_DEAD;