diff options
author | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2003-03-12 00:15:31 +0000 |
---|---|---|
committer | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2003-03-12 00:15:31 +0000 |
commit | ee53d3b8685245febda44ac761877871ec4cd0f4 (patch) | |
tree | 67e5392c3f16c0716b3ca8356cd93cd244b58d4b /xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/semaphore.c | |
parent | 7c2ffc6c5043e0a49fbe1b81f9da465ec68a9e64 (diff) | |
download | xen-ee53d3b8685245febda44ac761877871ec4cd0f4.tar.gz xen-ee53d3b8685245febda44ac761877871ec4cd0f4.tar.bz2 xen-ee53d3b8685245febda44ac761877871ec4cd0f4.zip |
bitkeeper revision 1.122.1.5 (3e6e7c23wQxW8Ugs0UKsqigrHkcXQg)
mkbuildtree:
new file
.del-hypervisor-ifs~86b59453fcfcbc0d:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hypervisor-ifs
.del-usercopy.c~a4e3819a4723317b:
Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/usercopy.c
.del-sys_i386.c~ad2d4399a2d28db9:
Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/sys_i386.c
.del-strstr.c~a59de40cfa231931:
Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/strstr.c
.del-semaphore.c~e68c48eef7115b45:
Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/semaphore.c
.del-pageattr.c~f12f3a2d4d9a5533:
Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/mm/pageattr.c
.del-old-checksum.c~f071ac0bcd5b2d9a:
Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/old-checksum.c
.del-mmx.c~c322b85572d0e637:
Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/mmx.c
.del-memcpy.c~40a930c62e045f5:
Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/memcpy.c
.del-iodebug.c~23f7b78313546ddc:
Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/iodebug.c
.del-getuser.S~b9140bdb7786f6dc:
Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/getuser.S
.del-extable.c~d3064107fd4524e5:
Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/mm/extable.c
.del-dec_and_lock.c~702a868529eefccf:
Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/dec_and_lock.c
.del-checksum.S~a821c465832e250c:
Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/lib/checksum.S
.del-xor.h~998f147781a971b7:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/xor.h
.del-vga.h~45c4f65abf0d3704:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/vga.h
.del-user.h~dd2c2e4cf89a81:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/user.h
.del-unistd.h~33920ed4177b943c:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/unistd.h
.del-unaligned.h~535ed3d510980f67:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/unaligned.h
.del-ucontext.h~217079ee95a5eb94:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ucontext.h
.del-uaccess.h~3681b94ef8d5a0f4:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/uaccess.h
.del-types.h~c4fb05b781c9652c:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/types.h
.del-tlb.h~6ad1bd639fc9d921:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/tlb.h
.del-timex.h~51d9b0c83c732bcc:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/timex.h
.del-termios.h~ccfbd8bcc37ae57d:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/termios.h
.del-termbits.h~438385b2cd8fd6b0:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/termbits.h
.del-string.h~673ad5d9e7f34adc:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/string.h
.del-string-486.h~365fff788bc1adf5:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/string-486.h
.del-statfs.h~65d9b1d7c4114f2e:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/statfs.h
.del-stat.h~c1aa8136a8e00c11:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/stat.h
.del-spinlock.h~ec9397b86265414c:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/spinlock.h
.del-softirq.h~587d767979e60f4a:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/softirq.h
.del-sockios.h~30f6e946644b28a4:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/sockios.h
.del-socket.h~4b1ff6de54a2e75:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/socket.h
.del-smplock.h~d5ea37028dfc0796:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/smplock.h
.del-signal.h~bff6ca682e48d282:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/signal.h
.del-siginfo.h~6e147c4b81453d48:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/siginfo.h
.del-sigcontext.h~15a1460eea0fc80d:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/sigcontext.h
.del-shmparam.h~97d1aa6d272dd55c:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/shmparam.h
.del-shmbuf.h~d92a8c2e377edd83:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/shmbuf.h
.del-setup.h~4250896c3e302c1d:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/setup.h
.del-serial.h~584ec6aaea6b0efc:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/serial.h
.del-sembuf.h~4fc6c36d718bc878:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/sembuf.h
.del-semaphore.h~90a0e3df1d186e71:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/semaphore.h
.del-ptrace.c~5c3f8d1f817aa462:
Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/ptrace.c
.del-init_task.c~319ec38b798d3c7c:
Delete: xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/init_task.c
.del-scatterlist.h~1988430d982706fb:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/scatterlist.h
.del-rwsem.h~548d272fd25fd023:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/rwsem.h
.del-rwlock.h~75a3e9a0d5b70d88:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/rwlock.h
.del-resource.h~4ac2e8ff9316f133:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/resource.h
.del-posix_types.h~14d068cffd4b8776:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/posix_types.h
.del-poll.h~15c1158844d735b:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/poll.h
.del-parport.h~ce6ec6eea26a26f:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/parport.h
.del-param.h~1fcb86dbbfaae433:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/param.h
.del-namei.h~f25c9c58c76cddf4:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/namei.h
.del-mtrr.h~375ef594799aeb34:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mtrr.h
.del-msr.h~cbf3b3e52c9bed91:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/msr.h
.del-msgbuf.h~ab21bfe6a970c7d6:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/msgbuf.h
.del-mpspec.h~9a3c3e9cda38bf43:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mpspec.h
.del-module.h~e271946131c6cf33:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/module.h
.del-mmx.h~bc63c7c24adb85ea:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mmx.h
.del-mman.h~43ec3a0326f0d774:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mman.h
.del-mca_dma.h~a4e495084d965428:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mca_dma.h
.del-mc146818rtc.h~d7e968dbd77bc13a:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/mc146818rtc.h
.del-math_emu.h~fba78190435e5abd:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/math_emu.h
.del-locks.h~e022163a8c6f92:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/locks.h
.del-linux_logo.h~2034953cfe415a:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/linux_logo.h
.del-ldt.h~191ca1efbffba82a:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ldt.h
.del-kmap_types.h~517fab0f9758f3b:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/kmap_types.h
.del-keyboard.h~b2a7fe4183f53eb0:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/keyboard.h
.del-ipcbuf.h~cee91af271f4ead9:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ipcbuf.h
.del-ipc.h~f6063a09bec6a01e:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ipc.h
.del-ioctls.h~cc185671abf46a0a:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ioctls.h
.del-ioctl.h~8603eb7a7f9acbad:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ioctl.h
.del-io_apic.h~9f66b09afe289021:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/io_apic.h
.del-init.h~9d30d474b845bc1:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/init.h
.del-ide.h~805c47c1a5ebf196:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/ide.h
.del-i387.h~3b360e96fea6fe7:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/i387.h
.del-hdreg.h~c4bbd6ffab3763d6:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hdreg.h
.del-hardirq.h~9b375250fe601395:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/hardirq.h
.del-floppy.h~d6f10807cbe15906:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/floppy.h
.del-fcntl.h~ee3e644a21150dde:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/fcntl.h
.del-errno.h~bab55cfe5c4ff883:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/errno.h
.del-elf.h~af645629b45e7fe7:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/elf.h
.del-dma.h~938dff3f930de2e4:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/dma.h
.del-div64.h~aa6562c04bfaf412:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/div64.h
.del-delay.h~e3ba89df403d5622:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/delay.h
.del-debugreg.h~b3975b26e222b6c3:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/debugreg.h
.del-current.h~800e8314ee81c074:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/current.h
.del-cpufeature.h~89666e396b49acdd:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/cpufeature.h
.del-checksum.h~82af6c19c8cc4ff3:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/checksum.h
.del-cache.h~694ef1ffd8450db4:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/cache.h
.del-byteorder.h~f14ceb3575444d8a:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/byteorder.h
.del-boot.h~83206c92a8649e3f:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/boot.h
.del-bitops.h~e3c609f48d6cdb91:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/bitops.h
.del-atomic.h~328669154749bfad:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/atomic.h
.del-apicdef.h~2f13a4cfaa79d855:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/apicdef.h
.del-apic.h~2690e76edadb6a8:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/apic.h
.del-a.out.h~b638f33fa82e889d:
Delete: xenolinux-2.4.21-pre4-sparse/include/asm-xeno/a.out.h
Diffstat (limited to 'xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/semaphore.c')
-rw-r--r-- | xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/semaphore.c | 291 |
1 files changed, 0 insertions, 291 deletions
diff --git a/xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/semaphore.c b/xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/semaphore.c deleted file mode 100644 index fd44981804..0000000000 --- a/xenolinux-2.4.21-pre4-sparse/arch/xeno/kernel/semaphore.c +++ /dev/null @@ -1,291 +0,0 @@ -/* - * i386 semaphore implementation. - * - * (C) Copyright 1999 Linus Torvalds - * - * Portions Copyright 1999 Red Hat, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version - * 2 of the License, or (at your option) any later version. - * - * rw semaphores implemented November 1999 by Benjamin LaHaise <bcrl@redhat.com> - */ -#include <linux/config.h> -#include <linux/sched.h> -#include <asm/semaphore.h> - -/* - * Semaphores are implemented using a two-way counter: - * The "count" variable is decremented for each process - * that tries to acquire the semaphore, while the "sleeping" - * variable is a count of such acquires. - * - * Notably, the inline "up()" and "down()" functions can - * efficiently test if they need to do any extra work (up - * needs to do something only if count was negative before - * the increment operation. - * - * "sleeping" and the contention routine ordering is - * protected by the semaphore spinlock. - * - * Note that these functions are only called when there is - * contention on the lock, and as such all this is the - * "non-critical" part of the whole semaphore business. The - * critical part is the inline stuff in <asm/semaphore.h> - * where we want to avoid any extra jumps and calls. - */ - -/* - * Logic: - * - only on a boundary condition do we need to care. When we go - * from a negative count to a non-negative, we wake people up. - * - when we go from a non-negative count to a negative do we - * (a) synchronize with the "sleeper" count and (b) make sure - * that we're on the wakeup list before we synchronize so that - * we cannot lose wakeup events. - */ - -void __up(struct semaphore *sem) -{ - wake_up(&sem->wait); -} - -static spinlock_t semaphore_lock = SPIN_LOCK_UNLOCKED; - -void __down(struct semaphore * sem) -{ - struct task_struct *tsk = current; - DECLARE_WAITQUEUE(wait, tsk); - tsk->state = TASK_UNINTERRUPTIBLE; - add_wait_queue_exclusive(&sem->wait, &wait); - - spin_lock_irq(&semaphore_lock); - sem->sleepers++; - for (;;) { - int sleepers = sem->sleepers; - - /* - * Add "everybody else" into it. They aren't - * playing, because we own the spinlock. - */ - if (!atomic_add_negative(sleepers - 1, &sem->count)) { - sem->sleepers = 0; - break; - } - sem->sleepers = 1; /* us - see -1 above */ - spin_unlock_irq(&semaphore_lock); - - schedule(); - tsk->state = TASK_UNINTERRUPTIBLE; - spin_lock_irq(&semaphore_lock); - } - spin_unlock_irq(&semaphore_lock); - remove_wait_queue(&sem->wait, &wait); - tsk->state = TASK_RUNNING; - wake_up(&sem->wait); -} - -int __down_interruptible(struct semaphore * sem) -{ - int retval = 0; - struct task_struct *tsk = current; - DECLARE_WAITQUEUE(wait, tsk); - tsk->state = TASK_INTERRUPTIBLE; - add_wait_queue_exclusive(&sem->wait, &wait); - - spin_lock_irq(&semaphore_lock); - sem->sleepers ++; - for (;;) { - int sleepers = sem->sleepers; - - /* - * With signals pending, this turns into - * the trylock failure case - we won't be - * sleeping, and we* can't get the lock as - * it has contention. Just correct the count - * and exit. - */ - if (signal_pending(current)) { - retval = -EINTR; - sem->sleepers = 0; - atomic_add(sleepers, &sem->count); - break; - } - - /* - * Add "everybody else" into it. They aren't - * playing, because we own the spinlock. The - * "-1" is because we're still hoping to get - * the lock. - */ - if (!atomic_add_negative(sleepers - 1, &sem->count)) { - sem->sleepers = 0; - break; - } - sem->sleepers = 1; /* us - see -1 above */ - spin_unlock_irq(&semaphore_lock); - - schedule(); - tsk->state = TASK_INTERRUPTIBLE; - spin_lock_irq(&semaphore_lock); - } - spin_unlock_irq(&semaphore_lock); - tsk->state = TASK_RUNNING; - remove_wait_queue(&sem->wait, &wait); - wake_up(&sem->wait); - return retval; -} - -/* - * Trylock failed - make sure we correct for - * having decremented the count. - * - * We could have done the trylock with a - * single "cmpxchg" without failure cases, - * but then it wouldn't work on a 386. - */ -int __down_trylock(struct semaphore * sem) -{ - int sleepers; - unsigned long flags; - - spin_lock_irqsave(&semaphore_lock, flags); - sleepers = sem->sleepers + 1; - sem->sleepers = 0; - - /* - * Add "everybody else" and us into it. They aren't - * playing, because we own the spinlock. - */ - if (!atomic_add_negative(sleepers, &sem->count)) - wake_up(&sem->wait); - - spin_unlock_irqrestore(&semaphore_lock, flags); - return 1; -} - - -/* - * The semaphore operations have a special calling sequence that - * allow us to do a simpler in-line version of them. These routines - * need to convert that sequence back into the C sequence when - * there is contention on the semaphore. - * - * %ecx contains the semaphore pointer on entry. Save the C-clobbered - * registers (%eax, %edx and %ecx) except %eax when used as a return - * value.. - */ -asm( -".text\n" -".align 4\n" -".globl __down_failed\n" -"__down_failed:\n\t" -#if defined(CONFIG_FRAME_POINTER) - "pushl %ebp\n\t" - "movl %esp,%ebp\n\t" -#endif - "pushl %eax\n\t" - "pushl %edx\n\t" - "pushl %ecx\n\t" - "call __down\n\t" - "popl %ecx\n\t" - "popl %edx\n\t" - "popl %eax\n\t" -#if defined(CONFIG_FRAME_POINTER) - "movl %ebp,%esp\n\t" - "popl %ebp\n\t" -#endif - "ret" -); - -asm( -".text\n" -".align 4\n" -".globl __down_failed_interruptible\n" -"__down_failed_interruptible:\n\t" -#if defined(CONFIG_FRAME_POINTER) - "pushl %ebp\n\t" - "movl %esp,%ebp\n\t" -#endif - "pushl %edx\n\t" - "pushl %ecx\n\t" - "call __down_interruptible\n\t" - "popl %ecx\n\t" - "popl %edx\n\t" -#if defined(CONFIG_FRAME_POINTER) - "movl %ebp,%esp\n\t" - "popl %ebp\n\t" -#endif - "ret" -); - -asm( -".text\n" -".align 4\n" -".globl __down_failed_trylock\n" -"__down_failed_trylock:\n\t" -#if defined(CONFIG_FRAME_POINTER) - "pushl %ebp\n\t" - "movl %esp,%ebp\n\t" -#endif - "pushl %edx\n\t" - "pushl %ecx\n\t" - "call __down_trylock\n\t" - "popl %ecx\n\t" - "popl %edx\n\t" -#if defined(CONFIG_FRAME_POINTER) - "movl %ebp,%esp\n\t" - "popl %ebp\n\t" -#endif - "ret" -); - -asm( -".text\n" -".align 4\n" -".globl __up_wakeup\n" -"__up_wakeup:\n\t" - "pushl %eax\n\t" - "pushl %edx\n\t" - "pushl %ecx\n\t" - "call __up\n\t" - "popl %ecx\n\t" - "popl %edx\n\t" - "popl %eax\n\t" - "ret" -); - -/* - * rw spinlock fallbacks - */ -#if defined(CONFIG_SMP) -asm( -".text\n" -".align 4\n" -".globl __write_lock_failed\n" -"__write_lock_failed:\n\t" - LOCK "addl $" RW_LOCK_BIAS_STR ",(%eax)\n" -"1: rep; nop\n\t" - "cmpl $" RW_LOCK_BIAS_STR ",(%eax)\n\t" - "jne 1b\n\t" - LOCK "subl $" RW_LOCK_BIAS_STR ",(%eax)\n\t" - "jnz __write_lock_failed\n\t" - "ret" -); - -asm( -".text\n" -".align 4\n" -".globl __read_lock_failed\n" -"__read_lock_failed:\n\t" - LOCK "incl (%eax)\n" -"1: rep; nop\n\t" - "cmpl $1,(%eax)\n\t" - "js 1b\n\t" - LOCK "decl (%eax)\n\t" - "js __read_lock_failed\n\t" - "ret" -); -#endif |