From 1a1cfcf90fbe895de61f5c96e84f70569db03d94 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra 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 Signed-off-by: Thomas Gleixner Signed-off-by: Paul Gortmaker --- include/linux/percpu.h | 24 +++++++++++++++++++++++- 1 files changed, 23 insertions(+), 1 deletions(-) diff --git a/include/linux/percpu.h b/include/linux/percpu.h index 4494bb0..ee2d901 100644 --- a/include/linux/percpu.h +++ b/include/linux/percpu.h @@ -50,14 +50,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.0.4