aboutsummaryrefslogtreecommitdiffstats
path: root/xen/common/spinlock.c
diff options
context:
space:
mode:
authorKeir Fraser <keir@xen.org>2010-11-18 11:45:33 +0000
committerKeir Fraser <keir@xen.org>2010-11-18 11:45:33 +0000
commit652ec2d1ec8c2c79dce01dc9136c0dfefeabc13e (patch)
tree5c31a11a97e5c3143712dd2c4dfc2e3da5a38505 /xen/common/spinlock.c
parentc03ec255cdfe2ee762e27be80132ee240be50314 (diff)
downloadxen-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.c54
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);
}