aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-06-09 17:56:07 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-06-09 17:56:07 -0400
commit68a29ef2e3f0edd154c3f5093e3c9ec772e4011f (patch)
treeb2c0594c16acbcb4b1905abac518110be5c4e69b
parent963649d735c8b6eb0f97e82c54f02426ff3f1f45 (diff)
parent315c5554c406fdad404a99dfefc931db0df80692 (diff)
Merge branch 'for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu
Pull percpu updates from Tejun Heo: "Nothing too exciting. percpu_ref is going through some interface changes and getting new features with more changes in the pipeline but given its young age and few users, it's very low impact" * 'for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu: percpu-refcount: implement percpu_ref_tryget() percpu-refcount: rename percpu_ref_tryget() to percpu_ref_tryget_live() percpu: Replace __get_cpu_var with this_cpu_ptr
-rw-r--r--include/linux/cgroup.h2
-rw-r--r--include/linux/percpu-refcount.h34
-rw-r--r--include/linux/percpu.h2
3 files changed, 35 insertions, 3 deletions
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index d60904b9e505..bddebc5cf8e7 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -101,7 +101,7 @@ static inline bool css_tryget(struct cgroup_subsys_state *css)
101{ 101{
102 if (css->flags & CSS_ROOT) 102 if (css->flags & CSS_ROOT)
103 return true; 103 return true;
104 return percpu_ref_tryget(&css->refcnt); 104 return percpu_ref_tryget_live(&css->refcnt);
105} 105}
106 106
107/** 107/**
diff --git a/include/linux/percpu-refcount.h b/include/linux/percpu-refcount.h
index 0afb48fd449d..5d8920e23073 100644
--- a/include/linux/percpu-refcount.h
+++ b/include/linux/percpu-refcount.h
@@ -121,6 +121,36 @@ static inline void percpu_ref_get(struct percpu_ref *ref)
121 * percpu_ref_tryget - try to increment a percpu refcount 121 * percpu_ref_tryget - try to increment a percpu refcount
122 * @ref: percpu_ref to try-get 122 * @ref: percpu_ref to try-get
123 * 123 *
124 * Increment a percpu refcount unless its count already reached zero.
125 * Returns %true on success; %false on failure.
126 *
127 * The caller is responsible for ensuring that @ref stays accessible.
128 */
129static inline bool percpu_ref_tryget(struct percpu_ref *ref)
130{
131 unsigned __percpu *pcpu_count;
132 int ret = false;
133
134 rcu_read_lock_sched();
135
136 pcpu_count = ACCESS_ONCE(ref->pcpu_count);
137
138 if (likely(REF_STATUS(pcpu_count) == PCPU_REF_PTR)) {
139 this_cpu_inc(*pcpu_count);
140 ret = true;
141 } else {
142 ret = atomic_inc_not_zero(&ref->count);
143 }
144
145 rcu_read_unlock_sched();
146
147 return ret;
148}
149
150/**
151 * percpu_ref_tryget_live - try to increment a live percpu refcount
152 * @ref: percpu_ref to try-get
153 *
124 * Increment a percpu refcount unless it has already been killed. Returns 154 * Increment a percpu refcount unless it has already been killed. Returns
125 * %true on success; %false on failure. 155 * %true on success; %false on failure.
126 * 156 *
@@ -128,8 +158,10 @@ static inline void percpu_ref_get(struct percpu_ref *ref)
128 * will fail. For such guarantee, percpu_ref_kill_and_confirm() should be 158 * will fail. For such guarantee, percpu_ref_kill_and_confirm() should be
129 * used. After the confirm_kill callback is invoked, it's guaranteed that 159 * used. After the confirm_kill callback is invoked, it's guaranteed that
130 * no new reference will be given out by percpu_ref_tryget(). 160 * no new reference will be given out by percpu_ref_tryget().
161 *
162 * The caller is responsible for ensuring that @ref stays accessible.
131 */ 163 */
132static inline bool percpu_ref_tryget(struct percpu_ref *ref) 164static inline bool percpu_ref_tryget_live(struct percpu_ref *ref)
133{ 165{
134 unsigned __percpu *pcpu_count; 166 unsigned __percpu *pcpu_count;
135 int ret = false; 167 int ret = false;
diff --git a/include/linux/percpu.h b/include/linux/percpu.h
index 495c6543a8f2..8419053d0f2e 100644
--- a/include/linux/percpu.h
+++ b/include/linux/percpu.h
@@ -29,7 +29,7 @@
29 */ 29 */
30#define get_cpu_var(var) (*({ \ 30#define get_cpu_var(var) (*({ \
31 preempt_disable(); \ 31 preempt_disable(); \
32 &__get_cpu_var(var); })) 32 this_cpu_ptr(&var); }))
33 33
34/* 34/*
35 * The weird & is necessary because sparse considers (void)(var) to be 35 * The weird & is necessary because sparse considers (void)(var) to be