diff options
author | Tejun Heo <tj@kernel.org> | 2014-05-13 11:27:24 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2014-05-13 11:27:24 -0400 |
commit | d39ea871c3c1269e2852ea096fff492ea034df8a (patch) | |
tree | 762859cc57b776048a968f1ab9ceb06d06d4ffb4 /include | |
parent | 2b53f41fa8604845f4f7c538723694a453088b15 (diff) | |
parent | 4fb6e25049cb6fa0accc7f1b7c192b952fad7ac8 (diff) |
Merge branch 'for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu into for-3.16
Pull to receive percpu_ref_tryget[_live]() changes. Planned cgroup
changes will make use of them.
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/cgroup.h | 2 | ||||
-rw-r--r-- | include/linux/percpu-refcount.h | 34 | ||||
-rw-r--r-- | include/linux/percpu.h | 2 |
3 files changed, 35 insertions, 3 deletions
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index f482f95c2c72..6ab3ee5d4a14 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h | |||
@@ -108,7 +108,7 @@ static inline bool css_tryget(struct cgroup_subsys_state *css) | |||
108 | { | 108 | { |
109 | if (css->flags & CSS_ROOT) | 109 | if (css->flags & CSS_ROOT) |
110 | return true; | 110 | return true; |
111 | return percpu_ref_tryget(&css->refcnt); | 111 | return percpu_ref_tryget_live(&css->refcnt); |
112 | } | 112 | } |
113 | 113 | ||
114 | /** | 114 | /** |
diff --git a/include/linux/percpu-refcount.h b/include/linux/percpu-refcount.h index 95961f0bf62d..dba35c411e8c 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 | */ | ||
129 | static 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 | */ |
132 | static inline bool percpu_ref_tryget(struct percpu_ref *ref) | 164 | static 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 e7a0b95ed527..539b3caa5748 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 |