vserver 1.9.5.x5
[linux-2.6.git] / include / asm-sparc / spinlock.h
index 4b44ef3..0cbd87a 100644 (file)
@@ -16,6 +16,9 @@
 struct _spinlock_debug {
        unsigned char lock;
        unsigned long owner_pc;
+#ifdef CONFIG_PREEMPT
+       unsigned int break_lock;
+#endif
 };
 typedef struct _spinlock_debug spinlock_t;
 
@@ -36,13 +39,15 @@ struct _rwlock_debug {
        volatile unsigned int lock;
        unsigned long owner_pc;
        unsigned long reader_pc[NR_CPUS];
+#ifdef CONFIG_PREEMPT
+       unsigned int break_lock;
+#endif
 };
 typedef struct _rwlock_debug rwlock_t;
 
 #define RW_LOCK_UNLOCKED (rwlock_t) { 0, 0, {0} }
 
 #define rwlock_init(lp)        do { *(lp)= RW_LOCK_UNLOCKED; } while(0)
-#define rwlock_is_locked(lp) ((lp)->lock != 0)
 
 extern void _do_read_lock(rwlock_t *rw, char *str);
 extern void _do_read_unlock(rwlock_t *rw, char *str);
@@ -79,8 +84,14 @@ do { unsigned long flags; \
 
 #else /* !CONFIG_DEBUG_SPINLOCK */
 
-typedef unsigned char spinlock_t;
-#define SPIN_LOCK_UNLOCKED     0
+typedef struct {
+       unsigned char lock;
+#ifdef CONFIG_PREEMPT
+       unsigned int break_lock;
+#endif
+} spinlock_t;
+
+#define SPIN_LOCK_UNLOCKED     (spinlock_t) { 0 }
 
 #define spin_lock_init(lock)   (*((unsigned char *)(lock)) = 0)
 #define spin_is_locked(lock)    (*((volatile unsigned char *)(lock)) != 0)
@@ -137,12 +148,16 @@ extern __inline__ void _raw_spin_unlock(spinlock_t *lock)
  * XXX This might create some problems with my dual spinlock
  * XXX scheme, deadlocks etc. -DaveM
  */
-typedef struct { volatile unsigned int lock; } rwlock_t;
+typedef struct {
+       volatile unsigned int lock;
+#ifdef CONFIG_PREEMPT
+       unsigned int break_lock;
+#endif
+} rwlock_t;
 
 #define RW_LOCK_UNLOCKED (rwlock_t) { 0 }
 
 #define rwlock_init(lp)        do { *(lp)= RW_LOCK_UNLOCKED; } while(0)
-#define rwlock_is_locked(lp) ((lp)->lock != 0)
 
 
 /* Sort of like atomic_t's on Sparc, but even more clever.