diff options
author | Tejun Heo <tj@kernel.org> | 2014-06-28 08:10:13 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2014-06-28 08:10:13 -0400 |
commit | 7d742075120deb831c7b94c268ca20d409e91d60 (patch) | |
tree | 5580ef27bade2963233cb36141d60770e3772c27 /lib/percpu-refcount.c | |
parent | eae7975ddf031b3084f4a5f7d88f698aefad96fb (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.c | 11 |
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 | ||
34 | static unsigned __percpu *pcpu_count_ptr(struct percpu_ref *ref) | 34 | static 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) | |||
153 | void percpu_ref_kill_and_confirm(struct percpu_ref *ref, | 153 | void 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); |