From: Thomas Gleixner <t...@linutronix.de>

The plain spinlock while sufficient does not update the local_lock
internals. Use a proper local_lock function instead to ease debugging.

Signed-off-by: Thomas Gleixner <t...@linutronix.de>
Cc: stable...@vger.kernel.org
Signed-off-by: Steven Rostedt <rost...@goodmis.org>
---
 include/linux/locallock.h |   11 +++++++++++
 mm/page_alloc.c           |    4 ++--
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/include/linux/locallock.h b/include/linux/locallock.h
index 0161fbb..f1804a3 100644
--- a/include/linux/locallock.h
+++ b/include/linux/locallock.h
@@ -137,6 +137,12 @@ static inline int __local_lock_irqsave(struct 
local_irq_lock *lv)
                _flags = __get_cpu_var(lvar).flags;                     \
        } while (0)
 
+#define local_lock_irqsave_on(lvar, _flags, cpu)                       \
+       do {                                                            \
+               __local_lock_irqsave(&per_cpu(lvar, cpu));              \
+               _flags = per_cpu(lvar, cpu).flags;                      \
+       } while (0)
+
 static inline int __local_unlock_irqrestore(struct local_irq_lock *lv,
                                            unsigned long flags)
 {
@@ -156,6 +162,11 @@ static inline int __local_unlock_irqrestore(struct 
local_irq_lock *lv,
                        put_local_var(lvar);                            \
        } while (0)
 
+#define local_unlock_irqrestore_on(lvar, flags, cpu)                   \
+       do {                                                            \
+               __local_unlock_irqrestore(&per_cpu(lvar, cpu), flags);  \
+       } while (0)
+
 #define local_spin_trylock_irq(lvar, lock)                             \
        ({                                                              \
                int __locked;                                           \
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 67202bc..8678a7f 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -227,9 +227,9 @@ static DEFINE_LOCAL_IRQ_LOCK(pa_lock);
 
 #ifdef CONFIG_PREEMPT_RT_BASE
 # define cpu_lock_irqsave(cpu, flags)          \
-       spin_lock_irqsave(&per_cpu(pa_lock, cpu).lock, flags)
+       local_lock_irqsave_on(pa_lock, flags, cpu)
 # define cpu_unlock_irqrestore(cpu, flags)             \
-       spin_unlock_irqrestore(&per_cpu(pa_lock, cpu).lock, flags)
+       local_unlock_irqrestore_on(pa_lock, flags, cpu)
 #else
 # define cpu_lock_irqsave(cpu, flags)          local_irq_save(flags)
 # define cpu_unlock_irqrestore(cpu, flags)     local_irq_restore(flags)
-- 
1.7.10.4


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to