patch-2.4.4 linux/arch/arm/kernel/semaphore.c
Next file: linux/arch/arm/kernel/setup.c
Previous file: linux/arch/arm/kernel/oldlatches.c
Back to the patch index
Back to the overall index
- Lines: 248
- Date:
Fri Apr 27 14:11:59 2001
- Orig file:
v2.4.3/linux/arch/arm/kernel/semaphore.c
- Orig date:
Sat Nov 11 19:02:40 2000
diff -u --recursive --new-file v2.4.3/linux/arch/arm/kernel/semaphore.c linux/arch/arm/kernel/semaphore.c
@@ -166,127 +166,6 @@
return 1;
}
-struct rw_semaphore *down_read_failed_biased(struct rw_semaphore *sem)
-{
- struct task_struct *tsk = current;
- DECLARE_WAITQUEUE(wait, tsk);
-
- add_wait_queue(&sem->wait, &wait); /* put ourselves at the head of the list */
-
- for (;;) {
- if (sem->read_bias_granted && xchg(&sem->read_bias_granted, 0))
- break;
- set_task_state(tsk, TASK_UNINTERRUPTIBLE);
- if (!sem->read_bias_granted)
- schedule();
- }
-
- remove_wait_queue(&sem->wait, &wait);
- tsk->state = TASK_RUNNING;
-
- return sem;
-}
-
-struct rw_semaphore *down_write_failed_biased(struct rw_semaphore *sem)
-{
- struct task_struct *tsk = current;
- DECLARE_WAITQUEUE(wait, tsk);
-
- add_wait_queue_exclusive(&sem->write_bias_wait, &wait); /* put ourselves at the end of the list */
-
- for (;;) {
- if (sem->write_bias_granted && xchg(&sem->write_bias_granted, 0))
- break;
- set_task_state(tsk, TASK_UNINTERRUPTIBLE);
- if (!sem->write_bias_granted)
- schedule();
- }
-
- remove_wait_queue(&sem->write_bias_wait, &wait);
- tsk->state = TASK_RUNNING;
-
- /* if the lock is currently unbiased, awaken the sleepers
- * FIXME: this wakes up the readers early in a bit of a
- * stampede -> bad!
- */
- if (atomic_read(&sem->count) >= 0)
- wake_up(&sem->wait);
-
- return sem;
-}
-
-/* Wait for the lock to become unbiased. Readers
- * are non-exclusive. =)
- */
-struct rw_semaphore *down_read_failed(struct rw_semaphore *sem)
-{
- struct task_struct *tsk = current;
- DECLARE_WAITQUEUE(wait, tsk);
-
- /* this takes care of granting the lock */
- __up_op_read(sem, __rwsem_wake);
-
- add_wait_queue(&sem->wait, &wait);
-
- while (atomic_read(&sem->count) < 0) {
- set_task_state(tsk, TASK_UNINTERRUPTIBLE);
- if (atomic_read(&sem->count) >= 0)
- break;
- schedule();
- }
-
- remove_wait_queue(&sem->wait, &wait);
- tsk->state = TASK_RUNNING;
-
- return sem;
-}
-
-/* Wait for the lock to become unbiased. Since we're
- * a writer, we'll make ourselves exclusive.
- */
-struct rw_semaphore *down_write_failed(struct rw_semaphore *sem)
-{
- struct task_struct *tsk = current;
- DECLARE_WAITQUEUE(wait, tsk);
-
- /* this takes care of granting the lock */
- __up_op_write(sem, __rwsem_wake);
-
- add_wait_queue_exclusive(&sem->wait, &wait);
-
- while (atomic_read(&sem->count) < 0) {
- set_task_state(tsk, TASK_UNINTERRUPTIBLE);
- if (atomic_read(&sem->count) >= 0)
- break; /* we must attempt to acquire or bias the lock */
- schedule();
- }
-
- remove_wait_queue(&sem->wait, &wait);
- tsk->state = TASK_RUNNING;
-
- return sem;
-}
-
-/* Called when someone has done an up that transitioned from
- * negative to non-negative, meaning that the lock has been
- * granted to whomever owned the bias.
- */
-struct rw_semaphore *rwsem_wake_readers(struct rw_semaphore *sem)
-{
- if (xchg(&sem->read_bias_granted, 1))
- BUG();
- wake_up(&sem->wait);
- return sem;
-}
-
-struct rw_semaphore *rwsem_wake_writer(struct rw_semaphore *sem)
-{
- if (xchg(&sem->write_bias_granted, 1))
- BUG();
- wake_up(&sem->write_bias_wait);
- return sem;
-}
-
/*
* The semaphore operations have a special calling sequence that
* allow us to do a simpler in-line version of them. These routines
@@ -333,61 +212,6 @@
bl __up
ldmfd sp!, {r0 - r3, pc}^
- .align 5
- .globl __down_read_failed
-__down_read_failed:
- stmfd sp!, {r0 - r3, lr}
- mov r0, ip
- bcc 1f
-1: bl down_read_failed_biased
- ldmfd sp!, {r0 - r3, pc}^
-2: bl down_read_failed
- mov r1, pc
- orr r2, r1, #
- teqp r2, #0
-
- ldr r3, [r0]
- subs r3, r3, #1
- str r3, [r0]
- ldmplfd sp!, {r0 - r3, pc}^
- orrcs r1, r1, #0x20000000 @ Set carry
- teqp r1, #0
- bcc 2b
- b 1b
-
- .align 5
- .globl __down_write_failed
-__down_write_failed:
- stmfd sp!, {r0 - r3, lr}
- mov r0, ip
- bcc 1f
-1: bl down_write_failed_biased
- ldmfd sp!, {r0 - r3, pc}^
-2: bl down_write_failed
- mov r1, pc
- orr r2, r1, #128
- teqp r2, #0
-
- ldr r3, [r0]
- subs r3, r3, #"RW_LOCK_BIAS_STR"
- str r3, [r0]
- ldmeqfd sp!, {r0 - r3, pc}^
- orrcs r1, r1, #0x20000000 @ Set carry
- teqp r1, #0
- bcc 2b
- b 1b
-
- .align 5
- .globl __rwsem_wake
-__rwsem_wake:
- stmfd sp!, {r0 - r3, lr}
- mov r0, ip
- beq 1f
- bl rwsem_wake_readers
- ldmfd sp!, {r0 - r3, pc}^
-1: bl rwsem_wake_writer
- ldmfd sp!, {r0 - r3, pc}^
-
.previous
");
@@ -426,57 +250,6 @@
stmfd sp!, {r0 - r3, lr}
mov r0, ip
bl __up
- ldmfd sp!, {r0 - r3, pc}
-
- .align 5
- .globl __down_read_failed
-__down_read_failed:
- stmfd sp!, {r0 - r3, lr}
- mov r0, ip
- bcc 1f
-1: bl down_read_failed_biased
- ldmfd sp!, {r0 - r3, pc}
-2: bl down_read_failed
- mrs r1, cpsr
- orr r2, r1, #128
- msr cpsr_c, r2
- ldr r3, [r0]
- subs r3, r3, #1
- str r3, [r0]
- msr cpsr_c, r1
- ldmplfd sp!, {r0 - r3, pc}
- bcc 2b
- b 1b
-
- .align 5
- .globl __down_write_failed
-__down_write_failed:
- stmfd sp!, {r0 - r3, lr}
- mov r0, ip
- bcc 1f
-1: bl down_write_failed_biased
- ldmfd sp!, {r0 - r3, pc}
-2: bl down_write_failed
- mrs r1, cpsr
- orr r2, r1, #128
- msr cpsr_c, r2
- ldr r3, [r0]
- subs r3, r3, #"RW_LOCK_BIAS_STR"
- str r3, [r0]
- msr cpsr_c, r1
- ldmeqfd sp!, {r0 - r3, pc}
- bcc 2b
- b 1b
-
- .align 5
- .globl __rwsem_wake
-__rwsem_wake:
- stmfd sp!, {r0 - r3, lr}
- mov r0, ip
- beq 1f
- bl rwsem_wake_readers
- ldmfd sp!, {r0 - r3, pc}
-1: bl rwsem_wake_writer
ldmfd sp!, {r0 - r3, pc}
.previous
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)