| From 0d41e2bab0423a9bdfb9cbfedef5319c8ab9da06 Mon Sep 17 00:00:00 2001 |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Wed, 15 Jun 2011 11:02:21 +0200 |
| Subject: [PATCH 191/270] lglocks-rt.patch |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| --- |
| include/linux/lglock.h | 99 ++++++++++++++++++++++++++++++++++++++++++++++++ |
| 1 file changed, 99 insertions(+) |
| |
| diff --git a/include/linux/lglock.h b/include/linux/lglock.h |
| index 87f402c..52b289f 100644 |
| --- a/include/linux/lglock.h |
| +++ b/include/linux/lglock.h |
| @@ -71,6 +71,8 @@ |
| extern void name##_global_lock_online(void); \ |
| extern void name##_global_unlock_online(void); \ |
| |
| +#ifndef CONFIG_PREEMPT_RT_FULL |
| + |
| #define DEFINE_LGLOCK(name) \ |
| \ |
| DEFINE_SPINLOCK(name##_cpu_lock); \ |
| @@ -197,4 +199,101 @@ |
| preempt_enable(); \ |
| } \ |
| EXPORT_SYMBOL(name##_global_unlock); |
| + |
| +#else /* !PREEMPT_RT_FULL */ |
| +#define DEFINE_LGLOCK(name) \ |
| + \ |
| + DEFINE_PER_CPU(struct rt_mutex, name##_lock); \ |
| + DEFINE_LGLOCK_LOCKDEP(name); \ |
| + \ |
| + void name##_lock_init(void) { \ |
| + int i; \ |
| + LOCKDEP_INIT_MAP(&name##_lock_dep_map, #name, &name##_lock_key, 0); \ |
| + for_each_possible_cpu(i) { \ |
| + struct rt_mutex *lock; \ |
| + lock = &per_cpu(name##_lock, i); \ |
| + rt_mutex_init(lock); \ |
| + } \ |
| + } \ |
| + EXPORT_SYMBOL(name##_lock_init); \ |
| + \ |
| + void name##_local_lock(void) { \ |
| + struct rt_mutex *lock; \ |
| + migrate_disable(); \ |
| + rwlock_acquire_read(&name##_lock_dep_map, 0, 0, _THIS_IP_); \ |
| + lock = &__get_cpu_var(name##_lock); \ |
| + __rt_spin_lock(lock); \ |
| + } \ |
| + EXPORT_SYMBOL(name##_local_lock); \ |
| + \ |
| + void name##_local_unlock(void) { \ |
| + struct rt_mutex *lock; \ |
| + rwlock_release(&name##_lock_dep_map, 1, _THIS_IP_); \ |
| + lock = &__get_cpu_var(name##_lock); \ |
| + __rt_spin_unlock(lock); \ |
| + migrate_enable(); \ |
| + } \ |
| + EXPORT_SYMBOL(name##_local_unlock); \ |
| + \ |
| + void name##_local_lock_cpu(int cpu) { \ |
| + struct rt_mutex *lock; \ |
| + rwlock_acquire_read(&name##_lock_dep_map, 0, 0, _THIS_IP_); \ |
| + lock = &per_cpu(name##_lock, cpu); \ |
| + __rt_spin_lock(lock); \ |
| + } \ |
| + EXPORT_SYMBOL(name##_local_lock_cpu); \ |
| + \ |
| + void name##_local_unlock_cpu(int cpu) { \ |
| + struct rt_mutex *lock; \ |
| + rwlock_release(&name##_lock_dep_map, 1, _THIS_IP_); \ |
| + lock = &per_cpu(name##_lock, cpu); \ |
| + __rt_spin_unlock(lock); \ |
| + } \ |
| + EXPORT_SYMBOL(name##_local_unlock_cpu); \ |
| + \ |
| + void name##_global_lock_online(void) { \ |
| + int i; \ |
| + rwlock_acquire(&name##_lock_dep_map, 0, 0, _RET_IP_); \ |
| + for_each_online_cpu(i) { \ |
| + struct rt_mutex *lock; \ |
| + lock = &per_cpu(name##_lock, i); \ |
| + __rt_spin_lock(lock); \ |
| + } \ |
| + } \ |
| + EXPORT_SYMBOL(name##_global_lock_online); \ |
| + \ |
| + void name##_global_unlock_online(void) { \ |
| + int i; \ |
| + rwlock_release(&name##_lock_dep_map, 1, _RET_IP_); \ |
| + for_each_online_cpu(i) { \ |
| + struct rt_mutex *lock; \ |
| + lock = &per_cpu(name##_lock, i); \ |
| + __rt_spin_unlock(lock); \ |
| + } \ |
| + } \ |
| + EXPORT_SYMBOL(name##_global_unlock_online); \ |
| + \ |
| + void name##_global_lock(void) { \ |
| + int i; \ |
| + rwlock_acquire(&name##_lock_dep_map, 0, 0, _RET_IP_); \ |
| + for_each_possible_cpu(i) { \ |
| + struct rt_mutex *lock; \ |
| + lock = &per_cpu(name##_lock, i); \ |
| + __rt_spin_lock(lock); \ |
| + } \ |
| + } \ |
| + EXPORT_SYMBOL(name##_global_lock); \ |
| + \ |
| + void name##_global_unlock(void) { \ |
| + int i; \ |
| + rwlock_release(&name##_lock_dep_map, 1, _RET_IP_); \ |
| + for_each_possible_cpu(i) { \ |
| + struct rt_mutex *lock; \ |
| + lock = &per_cpu(name##_lock, i); \ |
| + __rt_spin_unlock(lock); \ |
| + } \ |
| + } \ |
| + EXPORT_SYMBOL(name##_global_unlock); |
| +#endif /* PRREMPT_RT_FULL */ |
| + |
| #endif |
| -- |
| 1.7.10.4 |
| |