diff options
Diffstat (limited to 'include/asm-i386/semaphore.h')
| -rw-r--r-- | include/asm-i386/semaphore.h | 53 |
1 files changed, 19 insertions, 34 deletions
diff --git a/include/asm-i386/semaphore.h b/include/asm-i386/semaphore.h index d51e800acf29..4e34a468c383 100644 --- a/include/asm-i386/semaphore.h +++ b/include/asm-i386/semaphore.h | |||
| @@ -100,13 +100,10 @@ static inline void down(struct semaphore * sem) | |||
| 100 | __asm__ __volatile__( | 100 | __asm__ __volatile__( |
| 101 | "# atomic down operation\n\t" | 101 | "# atomic down operation\n\t" |
| 102 | LOCK_PREFIX "decl %0\n\t" /* --sem->count */ | 102 | LOCK_PREFIX "decl %0\n\t" /* --sem->count */ |
| 103 | "js 2f\n" | 103 | "jns 2f\n" |
| 104 | "1:\n" | 104 | "\tlea %0,%%eax\n\t" |
| 105 | LOCK_SECTION_START("") | 105 | "call __down_failed\n" |
| 106 | "2:\tlea %0,%%eax\n\t" | 106 | "2:" |
| 107 | "call __down_failed\n\t" | ||
| 108 | "jmp 1b\n" | ||
| 109 | LOCK_SECTION_END | ||
| 110 | :"+m" (sem->count) | 107 | :"+m" (sem->count) |
| 111 | : | 108 | : |
| 112 | :"memory","ax"); | 109 | :"memory","ax"); |
| @@ -123,16 +120,13 @@ static inline int down_interruptible(struct semaphore * sem) | |||
| 123 | might_sleep(); | 120 | might_sleep(); |
| 124 | __asm__ __volatile__( | 121 | __asm__ __volatile__( |
| 125 | "# atomic interruptible down operation\n\t" | 122 | "# atomic interruptible down operation\n\t" |
| 123 | "xorl %0,%0\n\t" | ||
| 126 | LOCK_PREFIX "decl %1\n\t" /* --sem->count */ | 124 | LOCK_PREFIX "decl %1\n\t" /* --sem->count */ |
| 127 | "js 2f\n\t" | 125 | "jns 2f\n\t" |
| 128 | "xorl %0,%0\n" | 126 | "lea %1,%%eax\n\t" |
| 129 | "1:\n" | 127 | "call __down_failed_interruptible\n" |
| 130 | LOCK_SECTION_START("") | 128 | "2:" |
| 131 | "2:\tlea %1,%%eax\n\t" | 129 | :"=&a" (result), "+m" (sem->count) |
| 132 | "call __down_failed_interruptible\n\t" | ||
| 133 | "jmp 1b\n" | ||
| 134 | LOCK_SECTION_END | ||
| 135 | :"=a" (result), "+m" (sem->count) | ||
| 136 | : | 130 | : |
| 137 | :"memory"); | 131 | :"memory"); |
| 138 | return result; | 132 | return result; |
| @@ -148,16 +142,13 @@ static inline int down_trylock(struct semaphore * sem) | |||
| 148 | 142 | ||
| 149 | __asm__ __volatile__( | 143 | __asm__ __volatile__( |
| 150 | "# atomic interruptible down operation\n\t" | 144 | "# atomic interruptible down operation\n\t" |
| 145 | "xorl %0,%0\n\t" | ||
| 151 | LOCK_PREFIX "decl %1\n\t" /* --sem->count */ | 146 | LOCK_PREFIX "decl %1\n\t" /* --sem->count */ |
| 152 | "js 2f\n\t" | 147 | "jns 2f\n\t" |
| 153 | "xorl %0,%0\n" | 148 | "lea %1,%%eax\n\t" |
| 154 | "1:\n" | ||
| 155 | LOCK_SECTION_START("") | ||
| 156 | "2:\tlea %1,%%eax\n\t" | ||
| 157 | "call __down_failed_trylock\n\t" | 149 | "call __down_failed_trylock\n\t" |
| 158 | "jmp 1b\n" | 150 | "2:\n" |
| 159 | LOCK_SECTION_END | 151 | :"=&a" (result), "+m" (sem->count) |
| 160 | :"=a" (result), "+m" (sem->count) | ||
| 161 | : | 152 | : |
| 162 | :"memory"); | 153 | :"memory"); |
| 163 | return result; | 154 | return result; |
| @@ -166,22 +157,16 @@ static inline int down_trylock(struct semaphore * sem) | |||
| 166 | /* | 157 | /* |
| 167 | * Note! This is subtle. We jump to wake people up only if | 158 | * Note! This is subtle. We jump to wake people up only if |
| 168 | * the semaphore was negative (== somebody was waiting on it). | 159 | * the semaphore was negative (== somebody was waiting on it). |
| 169 | * The default case (no contention) will result in NO | ||
| 170 | * jumps for both down() and up(). | ||
| 171 | */ | 160 | */ |
| 172 | static inline void up(struct semaphore * sem) | 161 | static inline void up(struct semaphore * sem) |
| 173 | { | 162 | { |
| 174 | __asm__ __volatile__( | 163 | __asm__ __volatile__( |
| 175 | "# atomic up operation\n\t" | 164 | "# atomic up operation\n\t" |
| 176 | LOCK_PREFIX "incl %0\n\t" /* ++sem->count */ | 165 | LOCK_PREFIX "incl %0\n\t" /* ++sem->count */ |
| 177 | "jle 2f\n" | 166 | "jg 1f\n\t" |
| 178 | "1:\n" | 167 | "lea %0,%%eax\n\t" |
| 179 | LOCK_SECTION_START("") | 168 | "call __up_wakeup\n" |
| 180 | "2:\tlea %0,%%eax\n\t" | 169 | "1:" |
| 181 | "call __up_wakeup\n\t" | ||
| 182 | "jmp 1b\n" | ||
| 183 | LOCK_SECTION_END | ||
| 184 | ".subsection 0\n" | ||
| 185 | :"+m" (sem->count) | 170 | :"+m" (sem->count) |
| 186 | : | 171 | : |
| 187 | :"memory","ax"); | 172 | :"memory","ax"); |
