git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git]
/
kernel
/
spinlock.c
diff --git
a/kernel/spinlock.c
b/kernel/spinlock.c
index
0c3f9d8
..
d1b8107
100644
(file)
--- a/
kernel/spinlock.c
+++ b/
kernel/spinlock.c
@@
-3,7
+3,10
@@
*
* Author: Zwane Mwaikambo <zwane@fsmlabs.com>
*
*
* Author: Zwane Mwaikambo <zwane@fsmlabs.com>
*
- * Copyright (2004) Ingo Molnar
+ * Copyright (2004, 2005) Ingo Molnar
+ *
+ * This file contains the spinlock/rwlock implementations for the
+ * SMP and the DEBUG_SPINLOCK cases. (UP-nondebug inlines them)
*/
#include <linux/config.h>
*/
#include <linux/config.h>
@@
-17,12
+20,12
@@
* Generic declaration of the raw read_trylock() function,
* architectures are supposed to optimize this:
*/
* Generic declaration of the raw read_trylock() function,
* architectures are supposed to optimize this:
*/
-int __lockfunc generic_
raw_read_trylock(
rwlock_t *lock)
+int __lockfunc generic_
_raw_read_trylock(raw_
rwlock_t *lock)
{
{
- _raw_read_lock(lock);
+ _
_
raw_read_lock(lock);
return 1;
}
return 1;
}
-EXPORT_SYMBOL(generic_raw_read_trylock);
+EXPORT_SYMBOL(generic_
_
raw_read_trylock);
int __lockfunc _spin_trylock(spinlock_t *lock)
{
int __lockfunc _spin_trylock(spinlock_t *lock)
{
@@
-57,7
+60,7
@@
int __lockfunc _write_trylock(rwlock_t *lock)
}
EXPORT_SYMBOL(_write_trylock);
}
EXPORT_SYMBOL(_write_trylock);
-#if
ndef CONFIG_PREEMPT
+#if
!defined(CONFIG_PREEMPT) || !defined(CONFIG_SMP)
void __lockfunc _read_lock(rwlock_t *lock)
{
void __lockfunc _read_lock(rwlock_t *lock)
{
@@
-72,7
+75,7
@@
unsigned long __lockfunc _spin_lock_irqsave(spinlock_t *lock)
local_irq_save(flags);
preempt_disable();
local_irq_save(flags);
preempt_disable();
- _raw_spin_lock_flags(lock, flags);
+ _raw_spin_lock_flags(lock,
&
flags);
return flags;
}
EXPORT_SYMBOL(_spin_lock_irqsave);
return flags;
}
EXPORT_SYMBOL(_spin_lock_irqsave);
@@
-176,16
+179,16
@@
EXPORT_SYMBOL(_write_lock);
#define BUILD_LOCK_OPS(op, locktype) \
void __lockfunc _##op##_lock(locktype##_t *lock) \
{ \
#define BUILD_LOCK_OPS(op, locktype) \
void __lockfunc _##op##_lock(locktype##_t *lock) \
{ \
- preempt_disable(); \
for (;;) { \
for (;;) { \
+ preempt_disable(); \
if (likely(_raw_##op##_trylock(lock))) \
break; \
preempt_enable(); \
if (likely(_raw_##op##_trylock(lock))) \
break; \
preempt_enable(); \
+ \
if (!(lock)->break_lock) \
(lock)->break_lock = 1; \
while (!op##_can_lock(lock) && (lock)->break_lock) \
cpu_relax(); \
if (!(lock)->break_lock) \
(lock)->break_lock = 1; \
while (!op##_can_lock(lock) && (lock)->break_lock) \
cpu_relax(); \
- preempt_disable(); \
} \
(lock)->break_lock = 0; \
} \
} \
(lock)->break_lock = 0; \
} \
@@
-196,19
+199,18
@@
unsigned long __lockfunc _##op##_lock_irqsave(locktype##_t *lock) \
{ \
unsigned long flags; \
\
{ \
unsigned long flags; \
\
- preempt_disable(); \
for (;;) { \
for (;;) { \
+ preempt_disable(); \
local_irq_save(flags); \
if (likely(_raw_##op##_trylock(lock))) \
break; \
local_irq_restore(flags); \
local_irq_save(flags); \
if (likely(_raw_##op##_trylock(lock))) \
break; \
local_irq_restore(flags); \
- \
preempt_enable(); \
preempt_enable(); \
+ \
if (!(lock)->break_lock) \
(lock)->break_lock = 1; \
while (!op##_can_lock(lock) && (lock)->break_lock) \
cpu_relax(); \
if (!(lock)->break_lock) \
(lock)->break_lock = 1; \
while (!op##_can_lock(lock) && (lock)->break_lock) \
cpu_relax(); \
- preempt_disable(); \
} \
(lock)->break_lock = 0; \
return flags; \
} \
(lock)->break_lock = 0; \
return flags; \