aboutsummaryrefslogtreecommitdiffstats
path: root/lib/percpu-refcount.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2014-06-28 08:10:13 -0400
committerTejun Heo <tj@kernel.org>2014-06-28 08:10:13 -0400
commit7d742075120deb831c7b94c268ca20d409e91d60 (patch)
tree5580ef27bade2963233cb36141d60770e3772c27 /lib/percpu-refcount.c
parenteae7975ddf031b3084f4a5f7d88f698aefad96fb (diff)
percpu-refcount: use unsigned long for pcpu_count pointer
percpu_ref->pcpu_count is a percpu pointer with a status flag in its lowest bit. As such, it always goes through arithmetic operations which is very cumbersome to do on a pointer. It has to be first casted to unsigned long and then back. Let's just make the field unsigned long so that we can skip the first casts. While at it, rename it to pcpu_counter_ptr to clarify that it's a pointer value. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Kent Overstreet <kmo@daterainc.com> Cc: Christoph Lameter <cl@linux-foundation.org>
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);