blob: 2a5310b76af94e9a567d9479666da02c1252c08b [file] [log] [blame]
From 231b8c5bc149824cdca6c54154d08dfd30536da4 Mon Sep 17 00:00:00 2001
From: Peter Zijlstra <a.p.zijlstra@chello.nl>
Date: Fri, 3 Jul 2009 08:44:39 -0500
Subject: [PATCH] cpu-hotplug: get_cpu_var_locked online aware
commit 849ac1ba25f218b94876174bc77c25403420d768 in tip.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
diff --git a/include/linux/percpu.h b/include/linux/percpu.h
index 9dda3e3..ea3dfff 100644
--- a/include/linux/percpu.h
+++ b/include/linux/percpu.h
@@ -43,14 +43,36 @@
* same as the normal per-CPU variables, so there is no runtime
* overhead.
*/
+#ifdef CONFIG_PREEMPT_RT
#define get_cpu_var_locked(var, cpuptr) \
(*({ \
- int __cpu = raw_smp_processor_id(); \
+ spinlock_t *__lock; \
+ int __cpu; \
\
+again: \
+ __cpu = raw_smp_processor_id(); \
+ __lock = &__get_cpu_lock(var, __cpu); \
+ spin_lock(__lock); \
+ if (!cpu_online(__cpu)) { \
+ spin_unlock(__lock); \
+ goto again; \
+ } \
*(cpuptr) = __cpu; \
+ &__get_cpu_var_locked(var, __cpu); \
+}))
+#else
+#define get_cpu_var_locked(var, cpuptr) \
+(*({ \
+ int __cpu; \
+ \
+ preempt_disable(); \
+ __cpu = smp_processor_id(); \
spin_lock(&__get_cpu_lock(var, __cpu)); \
+ preempt_enable(); \
+ *(cpuptr) = __cpu; \
&__get_cpu_var_locked(var, __cpu); \
}))
+#endif
#define put_cpu_var_locked(var, cpu) \
do { (void)cpu; spin_unlock(&__get_cpu_lock(var, cpu)); } while (0)
--
1.7.1.1