|
@@ -188,14 +188,12 @@ rwsem_down_failed_common(struct rw_semaphore *sem,
|
|
|
struct task_struct *tsk = current;
|
|
|
signed long count;
|
|
|
|
|
|
- set_task_state(tsk, TASK_UNINTERRUPTIBLE);
|
|
|
-
|
|
|
/* set up my own style of waitqueue */
|
|
|
- raw_spin_lock_irq(&sem->wait_lock);
|
|
|
waiter.task = tsk;
|
|
|
waiter.type = type;
|
|
|
get_task_struct(tsk);
|
|
|
|
|
|
+ raw_spin_lock_irq(&sem->wait_lock);
|
|
|
if (list_empty(&sem->wait_list))
|
|
|
adjustment += RWSEM_WAITING_BIAS;
|
|
|
list_add_tail(&waiter.list, &sem->wait_list);
|
|
@@ -218,7 +216,8 @@ rwsem_down_failed_common(struct rw_semaphore *sem,
|
|
|
raw_spin_unlock_irq(&sem->wait_lock);
|
|
|
|
|
|
/* wait to be given the lock */
|
|
|
- for (;;) {
|
|
|
+ while (true) {
|
|
|
+ set_task_state(tsk, TASK_UNINTERRUPTIBLE);
|
|
|
if (!waiter.task)
|
|
|
break;
|
|
|
|
|
@@ -231,7 +230,6 @@ rwsem_down_failed_common(struct rw_semaphore *sem,
|
|
|
}
|
|
|
raw_spin_unlock_irq(&sem->wait_lock);
|
|
|
schedule();
|
|
|
- set_task_state(tsk, TASK_UNINTERRUPTIBLE);
|
|
|
}
|
|
|
|
|
|
tsk->state = TASK_RUNNING;
|