diff options
author | Keir Fraser <keir@xen.org> | 2010-11-18 11:45:33 +0000 |
---|---|---|
committer | Keir Fraser <keir@xen.org> | 2010-11-18 11:45:33 +0000 |
commit | 652ec2d1ec8c2c79dce01dc9136c0dfefeabc13e (patch) | |
tree | 5c31a11a97e5c3143712dd2c4dfc2e3da5a38505 /xen/common/spinlock.c | |
parent | c03ec255cdfe2ee762e27be80132ee240be50314 (diff) | |
download | xen-652ec2d1ec8c2c79dce01dc9136c0dfefeabc13e.tar.gz xen-652ec2d1ec8c2c79dce01dc9136c0dfefeabc13e.tar.bz2 xen-652ec2d1ec8c2c79dce01dc9136c0dfefeabc13e.zip |
Define Linux-style <preempt.h> interface.
Use it to disable sleeping in spinlock and rcu-read regions.
Signed-off-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'xen/common/spinlock.c')
-rw-r--r-- | xen/common/spinlock.c | 54 |
1 files changed, 21 insertions, 33 deletions
diff --git a/xen/common/spinlock.c b/xen/common/spinlock.c index fff796171d..2abf89e9b1 100644 --- a/xen/common/spinlock.c +++ b/xen/common/spinlock.c @@ -5,6 +5,7 @@ #include <xen/time.h> #include <xen/spinlock.h> #include <xen/guest_access.h> +#include <xen/preempt.h> #include <public/sysctl.h> #include <asm/processor.h> @@ -39,22 +40,9 @@ void spin_debug_disable(void) atomic_dec(&spin_debug); } -static DEFINE_PER_CPU(atomic_t, lockdepth); - -#define lockdepth_inc() atomic_inc(&this_cpu(lockdepth)) -#define lockdepth_dec() atomic_dec(&this_cpu(lockdepth)) - -unsigned int locking_depth(void) -{ - return atomic_read(&this_cpu(lockdepth)); -} - #else /* defined(NDEBUG) */ #define check_lock(l) ((void)0) -#define lockdepth_inc() ((void)0) -#define lockdepth_dec() ((void)0) -unsigned int locking_depth(void) { return 0; } #endif @@ -94,7 +82,7 @@ void _spin_lock(spinlock_t *lock) cpu_relax(); } LOCK_PROFILE_GOT; - lockdepth_inc(); + preempt_disable(); } void _spin_lock_irq(spinlock_t *lock) @@ -113,7 +101,7 @@ void _spin_lock_irq(spinlock_t *lock) local_irq_disable(); } LOCK_PROFILE_GOT; - lockdepth_inc(); + preempt_disable(); } unsigned long _spin_lock_irqsave(spinlock_t *lock) @@ -132,20 +120,20 @@ unsigned long _spin_lock_irqsave(spinlock_t *lock) local_irq_save(flags); } LOCK_PROFILE_GOT; - lockdepth_inc(); + preempt_disable(); return flags; } void _spin_unlock(spinlock_t *lock) { - lockdepth_dec(); + preempt_enable(); LOCK_PROFILE_REL; _raw_spin_unlock(&lock->raw); } void _spin_unlock_irq(spinlock_t *lock) { - lockdepth_dec(); + preempt_enable(); LOCK_PROFILE_REL; _raw_spin_unlock(&lock->raw); local_irq_enable(); @@ -153,7 +141,7 @@ void _spin_unlock_irq(spinlock_t *lock) void _spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags) { - lockdepth_dec(); + preempt_enable(); LOCK_PROFILE_REL; _raw_spin_unlock(&lock->raw); local_irq_restore(flags); @@ -173,7 +161,7 @@ int _spin_trylock(spinlock_t *lock) #ifdef LOCK_PROFILE lock->profile.time_locked = NOW(); #endif - lockdepth_inc(); + preempt_disable(); return 1; } @@ -247,7 +235,7 @@ void _read_lock(rwlock_t *lock) { check_lock(&lock->debug); _raw_read_lock(&lock->raw); - lockdepth_inc(); + preempt_disable(); } void _read_lock_irq(rwlock_t *lock) @@ -256,7 +244,7 @@ void _read_lock_irq(rwlock_t *lock) local_irq_disable(); check_lock(&lock->debug); _raw_read_lock(&lock->raw); - lockdepth_inc(); + preempt_disable(); } unsigned long _read_lock_irqsave(rwlock_t *lock) @@ -265,26 +253,26 @@ unsigned long _read_lock_irqsave(rwlock_t *lock) local_irq_save(flags); check_lock(&lock->debug); _raw_read_lock(&lock->raw); - lockdepth_inc(); + preempt_disable(); return flags; } void _read_unlock(rwlock_t *lock) { - lockdepth_dec(); + preempt_enable(); _raw_read_unlock(&lock->raw); } void _read_unlock_irq(rwlock_t *lock) { - lockdepth_dec(); + preempt_enable(); _raw_read_unlock(&lock->raw); local_irq_enable(); } void _read_unlock_irqrestore(rwlock_t *lock, unsigned long flags) { - lockdepth_dec(); + preempt_enable(); _raw_read_unlock(&lock->raw); local_irq_restore(flags); } @@ -293,7 +281,7 @@ void _write_lock(rwlock_t *lock) { check_lock(&lock->debug); _raw_write_lock(&lock->raw); - lockdepth_inc(); + preempt_disable(); } void _write_lock_irq(rwlock_t *lock) @@ -302,7 +290,7 @@ void _write_lock_irq(rwlock_t *lock) local_irq_disable(); check_lock(&lock->debug); _raw_write_lock(&lock->raw); - lockdepth_inc(); + preempt_disable(); } unsigned long _write_lock_irqsave(rwlock_t *lock) @@ -311,7 +299,7 @@ unsigned long _write_lock_irqsave(rwlock_t *lock) local_irq_save(flags); check_lock(&lock->debug); _raw_write_lock(&lock->raw); - lockdepth_inc(); + preempt_disable(); return flags; } @@ -320,26 +308,26 @@ int _write_trylock(rwlock_t *lock) check_lock(&lock->debug); if ( !_raw_write_trylock(&lock->raw) ) return 0; - lockdepth_inc(); + preempt_disable(); return 1; } void _write_unlock(rwlock_t *lock) { - lockdepth_dec(); + preempt_enable(); _raw_write_unlock(&lock->raw); } void _write_unlock_irq(rwlock_t *lock) { - lockdepth_dec(); + preempt_enable(); _raw_write_unlock(&lock->raw); local_irq_enable(); } void _write_unlock_irqrestore(rwlock_t *lock, unsigned long flags) { - lockdepth_dec(); + preempt_enable(); _raw_write_unlock(&lock->raw); local_irq_restore(flags); } |