Commit a8618a0e8a06f75c6efec2a5477861d704d48b28
Committed by
Linus Torvalds
1 parent
424acaaeb3
rwsem: smaller wrappers around rwsem_down_failed_common
More code can be pushed from rwsem_down_read_failed and rwsem_down_write_failed into rwsem_down_failed_common. Following change adding down_read_critical infrastructure support also enjoys having flags available in a register rather than having to fish it out in the struct rwsem_waiter... Signed-off-by: Michel Lespinasse <walken@google.com> Acked-by: David Howells <dhowells@redhat.com> Cc: Mike Waychison <mikew@google.com> Cc: Suleiman Souhlal <suleiman@google.com> Cc: Ying Han <yinghan@google.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: "H. Peter Anvin" <hpa@zytor.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 10 additions and 15 deletions Side-by-side Diff
lib/rwsem.c
... | ... | @@ -171,8 +171,9 @@ |
171 | 171 | */ |
172 | 172 | static struct rw_semaphore __sched * |
173 | 173 | rwsem_down_failed_common(struct rw_semaphore *sem, |
174 | - struct rwsem_waiter *waiter, signed long adjustment) | |
174 | + unsigned int flags, signed long adjustment) | |
175 | 175 | { |
176 | + struct rwsem_waiter waiter; | |
176 | 177 | struct task_struct *tsk = current; |
177 | 178 | signed long count; |
178 | 179 | |
179 | 180 | |
... | ... | @@ -180,12 +181,13 @@ |
180 | 181 | |
181 | 182 | /* set up my own style of waitqueue */ |
182 | 183 | spin_lock_irq(&sem->wait_lock); |
183 | - waiter->task = tsk; | |
184 | + waiter.task = tsk; | |
185 | + waiter.flags = flags; | |
184 | 186 | get_task_struct(tsk); |
185 | 187 | |
186 | 188 | if (list_empty(&sem->wait_list)) |
187 | 189 | adjustment += RWSEM_WAITING_BIAS; |
188 | - list_add_tail(&waiter->list, &sem->wait_list); | |
190 | + list_add_tail(&waiter.list, &sem->wait_list); | |
189 | 191 | |
190 | 192 | /* we're now waiting on the lock, but no longer actively locking */ |
191 | 193 | count = rwsem_atomic_update(adjustment, sem); |
... | ... | @@ -206,7 +208,7 @@ |
206 | 208 | |
207 | 209 | /* wait to be given the lock */ |
208 | 210 | for (;;) { |
209 | - if (!waiter->task) | |
211 | + if (!waiter.task) | |
210 | 212 | break; |
211 | 213 | schedule(); |
212 | 214 | set_task_state(tsk, TASK_UNINTERRUPTIBLE); |
... | ... | @@ -223,11 +225,8 @@ |
223 | 225 | asmregparm struct rw_semaphore __sched * |
224 | 226 | rwsem_down_read_failed(struct rw_semaphore *sem) |
225 | 227 | { |
226 | - struct rwsem_waiter waiter; | |
227 | - | |
228 | - waiter.flags = RWSEM_WAITING_FOR_READ; | |
229 | - rwsem_down_failed_common(sem, &waiter, -RWSEM_ACTIVE_READ_BIAS); | |
230 | - return sem; | |
228 | + return rwsem_down_failed_common(sem, RWSEM_WAITING_FOR_READ, | |
229 | + -RWSEM_ACTIVE_READ_BIAS); | |
231 | 230 | } |
232 | 231 | |
233 | 232 | /* |
... | ... | @@ -236,12 +235,8 @@ |
236 | 235 | asmregparm struct rw_semaphore __sched * |
237 | 236 | rwsem_down_write_failed(struct rw_semaphore *sem) |
238 | 237 | { |
239 | - struct rwsem_waiter waiter; | |
240 | - | |
241 | - waiter.flags = RWSEM_WAITING_FOR_WRITE; | |
242 | - rwsem_down_failed_common(sem, &waiter, -RWSEM_ACTIVE_WRITE_BIAS); | |
243 | - | |
244 | - return sem; | |
238 | + return rwsem_down_failed_common(sem, RWSEM_WAITING_FOR_WRITE, | |
239 | + -RWSEM_ACTIVE_WRITE_BIAS); | |
245 | 240 | } |
246 | 241 | |
247 | 242 | /* |