summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/linux/locallock.h18
1 files changed, 14 insertions, 4 deletions
diff --git a/include/linux/locallock.h b/include/linux/locallock.h
index e7bd8be..eb338ce 100644
--- a/include/linux/locallock.h
+++ b/include/linux/locallock.h
@@ -36,10 +36,20 @@ struct local_irq_lock {
spin_lock_init(&per_cpu(lvar, __cpu).lock); \
} while (0)
+/*
+ * spin_lock|trylock|unlock_local flavour that does not migrate disable
+ * used for __local_lock|trylock|unlock where get_local_var/put_local_var
+ * already takes care of the migrate_disable/enable
+ * for CONFIG_PREEMPT_BASE map to the normal spin_* calls.
+ */
+# define spin_lock_local(lock) spin_lock(lock)
+# define spin_trylock_local(lock) spin_trylock(lock)
+# define spin_unlock_local(lock) spin_unlock(lock)
+
static inline void __local_lock(struct local_irq_lock *lv)
{
if (lv->owner != current) {
- spin_lock(&lv->lock);
+ spin_lock_local(&lv->lock);
LL_WARN(lv->owner);
LL_WARN(lv->nestcnt);
lv->owner = current;
@@ -52,7 +62,7 @@ static inline void __local_lock(struct local_irq_lock *lv)
static inline int __local_trylock(struct local_irq_lock *lv)
{
- if (lv->owner != current && spin_trylock(&lv->lock)) {
+ if (lv->owner != current && spin_trylock_local(&lv->lock)) {
LL_WARN(lv->owner);
LL_WARN(lv->nestcnt);
lv->owner = current;
@@ -79,7 +89,7 @@ static inline void __local_unlock(struct local_irq_lock *lv)
return;
lv->owner = NULL;
- spin_unlock(&lv->lock);
+ spin_unlock_local(&lv->lock);
}
#define local_unlock(lvar) \
@@ -211,7 +221,7 @@ static inline int __local_unlock_irqrestore(struct local_irq_lock *lv,
&__get_cpu_var(var); \
}))
-#define put_locked_var(lvar, var) local_unlock(lvar)
+#define put_locked_var(lvar, var) local_unlock(lvar);
#define local_lock_cpu(lvar) \
({ \