diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-09 17:56:07 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-09 17:56:07 -0400 |
commit | 68a29ef2e3f0edd154c3f5093e3c9ec772e4011f (patch) | |
tree | b2c0594c16acbcb4b1905abac518110be5c4e69b | |
parent | 963649d735c8b6eb0f97e82c54f02426ff3f1f45 (diff) | |
parent | 315c5554c406fdad404a99dfefc931db0df80692 (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.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 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 | */ | ||
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 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 |