percpu-refcount: add __must_check to percpu_ref_init() and don't use ACCESS_ONCE() in percpu_ref_kill_rcu()
Two small changes. * Unlike most init functions, percpu_ref_init() allocates memory and may fail. Let's mark it with __must_check in case the caller forgets. * percpu_ref_kill_rcu() is unnecessarily using ACCESS_ONCE() to dereference @ref->pcpu_count, which can be misleading. The pointer is guaranteed to be valid and visible and can't change underneath the function. Drop ACCESS_ONCE(). Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
ac899061a9
commit
acac7883ee
|
@ -66,7 +66,8 @@ struct percpu_ref {
|
||||||
struct rcu_head rcu;
|
struct rcu_head rcu;
|
||||||
};
|
};
|
||||||
|
|
||||||
int percpu_ref_init(struct percpu_ref *ref, percpu_ref_func_t *release);
|
int __must_check percpu_ref_init(struct percpu_ref *ref,
|
||||||
|
percpu_ref_func_t *release);
|
||||||
void percpu_ref_kill(struct percpu_ref *ref);
|
void percpu_ref_kill(struct percpu_ref *ref);
|
||||||
|
|
||||||
#define PCPU_STATUS_BITS 2
|
#define PCPU_STATUS_BITS 2
|
||||||
|
|
|
@ -57,12 +57,10 @@ int percpu_ref_init(struct percpu_ref *ref, percpu_ref_func_t *release)
|
||||||
static void percpu_ref_kill_rcu(struct rcu_head *rcu)
|
static void percpu_ref_kill_rcu(struct rcu_head *rcu)
|
||||||
{
|
{
|
||||||
struct percpu_ref *ref = container_of(rcu, struct percpu_ref, rcu);
|
struct percpu_ref *ref = container_of(rcu, struct percpu_ref, rcu);
|
||||||
unsigned __percpu *pcpu_count;
|
unsigned __percpu *pcpu_count = ref->pcpu_count;
|
||||||
unsigned count = 0;
|
unsigned count = 0;
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
pcpu_count = ACCESS_ONCE(ref->pcpu_count);
|
|
||||||
|
|
||||||
/* Mask out PCPU_REF_DEAD */
|
/* Mask out PCPU_REF_DEAD */
|
||||||
pcpu_count = (unsigned __percpu *)
|
pcpu_count = (unsigned __percpu *)
|
||||||
(((unsigned long) pcpu_count) & ~PCPU_STATUS_MASK);
|
(((unsigned long) pcpu_count) & ~PCPU_STATUS_MASK);
|
||||||
|
|
Loading…
Reference in New Issue