aboutsummaryrefslogtreecommitdiffstats
path: root/lib/percpu-refcount.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/percpu-refcount.c')
-rw-r--r--lib/percpu-refcount.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/lib/percpu-refcount.c b/lib/percpu-refcount.c
index 087f1a04f9bc..94e5b624de64 100644
--- a/lib/percpu-refcount.c
+++ b/lib/percpu-refcount.c
@@ -33,7 +33,7 @@
33 33
34static unsigned __percpu *pcpu_count_ptr(struct percpu_ref *ref) 34static unsigned __percpu *pcpu_count_ptr(struct percpu_ref *ref)
35{ 35{
36 return (unsigned __percpu *)((unsigned long)ref->pcpu_count & ~PCPU_REF_DEAD); 36 return (unsigned __percpu *)(ref->pcpu_count_ptr & ~PCPU_REF_DEAD);
37} 37}
38 38
39/** 39/**
@@ -51,8 +51,8 @@ int percpu_ref_init(struct percpu_ref *ref, percpu_ref_func_t *release)
51{ 51{
52 atomic_set(&ref->count, 1 + PCPU_COUNT_BIAS); 52 atomic_set(&ref->count, 1 + PCPU_COUNT_BIAS);
53 53
54 ref->pcpu_count = alloc_percpu(unsigned); 54 ref->pcpu_count_ptr = (unsigned long)alloc_percpu(unsigned);
55 if (!ref->pcpu_count) 55 if (!ref->pcpu_count_ptr)
56 return -ENOMEM; 56 return -ENOMEM;
57 57
58 ref->release = release; 58 ref->release = release;
@@ -153,11 +153,10 @@ static void percpu_ref_kill_rcu(struct rcu_head *rcu)
153void percpu_ref_kill_and_confirm(struct percpu_ref *ref, 153void percpu_ref_kill_and_confirm(struct percpu_ref *ref,
154 percpu_ref_func_t *confirm_kill) 154 percpu_ref_func_t *confirm_kill)
155{ 155{
156 WARN_ONCE((unsigned long)ref->pcpu_count & PCPU_REF_DEAD, 156 WARN_ONCE(ref->pcpu_count_ptr & PCPU_REF_DEAD,
157 "percpu_ref_kill() called more than once!\n"); 157 "percpu_ref_kill() called more than once!\n");
158 158
159 ref->pcpu_count = (unsigned __percpu *) 159 ref->pcpu_count_ptr |= PCPU_REF_DEAD;
160 (((unsigned long) ref->pcpu_count)|PCPU_REF_DEAD);
161 ref->confirm_kill = confirm_kill; 160 ref->confirm_kill = confirm_kill;
162 161
163 call_rcu_sched(&ref->rcu, percpu_ref_kill_rcu); 162 call_rcu_sched(&ref->rcu, percpu_ref_kill_rcu);