diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1999-10-09 00:00:47 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1999-10-09 00:00:47 +0000 |
commit | d6434e1042f3b0a6dfe1b1f615af369486f9b1fa (patch) | |
tree | e2be02f33984c48ec019c654051d27964e42c441 /include/asm-i386/semaphore.h | |
parent | 609d1e803baf519487233b765eb487f9ec227a18 (diff) |
Merge with 2.3.19.
Diffstat (limited to 'include/asm-i386/semaphore.h')
-rw-r--r-- | include/asm-i386/semaphore.h | 43 |
1 files changed, 20 insertions, 23 deletions
diff --git a/include/asm-i386/semaphore.h b/include/asm-i386/semaphore.h index 3298aeb13..3997b2aae 100644 --- a/include/asm-i386/semaphore.h +++ b/include/asm-i386/semaphore.h @@ -17,6 +17,10 @@ * potential and subtle race discovered by Ulrich Schmid * in down_interruptible(). Since I started to play here I * also implemented the `trylock' semaphore operation. + * 1999-07-02 Artur Skawina <skawina@geocities.com> + * Optimized "0(ecx)" -> "(ecx)" (the assembler does not + * do this). Changed calling sequences from push/jmp to + * traditional call/ret. * * If you would like to see an analysis of this implementation, please * ftp to gcom.com and download the file @@ -26,12 +30,12 @@ #include <asm/system.h> #include <asm/atomic.h> -#include <asm/spinlock.h> +#include <linux/spinlock.h> #include <linux/wait.h> struct semaphore { atomic_t count; - int waking; + int sleepers; wait_queue_head_t wait; #if WAITQUEUE_DEBUG long __magic; @@ -58,7 +62,7 @@ struct semaphore { #define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1) #define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0) -extern inline void __sema_init (struct semaphore *sem, int val) +extern inline void sema_init (struct semaphore *sem, int val) { /* * *sem = (struct semaphore)__SEMAPHORE_INITIALIZER((*sem),val); @@ -67,19 +71,12 @@ extern inline void __sema_init (struct semaphore *sem, int val) * GCC 2.7.2.3 emits a bogus warning. EGCS doesnt. Oh well. */ atomic_set(&sem->count, val); - sem->waking = 0; + sem->sleepers = 0; init_waitqueue_head(&sem->wait); #if WAITQUEUE_DEBUG sem->__magic = (int)&sem->__magic; #endif } -#define sema_init(sem,val) \ - do { \ - struct semaphore *__sem = (sem); \ - printk("sema_init called at %s, %d for semaphore 0x%08lx\n", \ - __FILE__, __LINE__, (unsigned long) __sem); \ - __sema_init(__sem, (val)); \ - while(1); static inline void init_MUTEX (struct semaphore *sem) { @@ -119,12 +116,12 @@ extern inline void down(struct semaphore * sem) #ifdef __SMP__ "lock ; " #endif - "decl 0(%0)\n\t" + "decl (%0)\n\t" /* --sem->count */ "js 2f\n" "1:\n" ".section .text.lock,\"ax\"\n" - "2:\tpushl $1b\n\t" - "jmp __down_failed\n" + "2:\tcall __down_failed\n\t" + "jmp 1b\n" ".previous" :/* no outputs */ :"c" (sem) @@ -144,13 +141,13 @@ extern inline int down_interruptible(struct semaphore * sem) #ifdef __SMP__ "lock ; " #endif - "decl 0(%1)\n\t" + "decl (%1)\n\t" /* --sem->count */ "js 2f\n\t" "xorl %0,%0\n" "1:\n" ".section .text.lock,\"ax\"\n" - "2:\tpushl $1b\n\t" - "jmp __down_failed_interruptible\n" + "2:\tcall __down_failed_interruptible\n\t" + "jmp 1b\n" ".previous" :"=a" (result) :"c" (sem) @@ -171,13 +168,13 @@ extern inline int down_trylock(struct semaphore * sem) #ifdef __SMP__ "lock ; " #endif - "decl 0(%1)\n\t" + "decl (%1)\n\t" /* --sem->count */ "js 2f\n\t" "xorl %0,%0\n" "1:\n" ".section .text.lock,\"ax\"\n" - "2:\tpushl $1b\n\t" - "jmp __down_failed_trylock\n" + "2:\tcall __down_failed_trylock\n\t" + "jmp 1b\n" ".previous" :"=a" (result) :"c" (sem) @@ -201,12 +198,12 @@ extern inline void up(struct semaphore * sem) #ifdef __SMP__ "lock ; " #endif - "incl 0(%0)\n\t" + "incl (%0)\n\t" /* ++sem->count */ "jle 2f\n" "1:\n" ".section .text.lock,\"ax\"\n" - "2:\tpushl $1b\n\t" - "jmp __up_wakeup\n" + "2:\tcall __up_wakeup\n\t" + "jmp 1b\n" ".previous" :/* no outputs */ :"c" (sem) |