Commit a8618a0e8a06f75c6efec2a5477861d704d48b28

Authored by Michel Lespinasse
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

... ... @@ -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 /*