| From 1a1cfcf90fbe895de61f5c96e84f70569db03d94 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> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| --- |
| 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 |
| |