| 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 |
| |