125 lines
3.8 KiB
Diff
125 lines
3.8 KiB
Diff
Subject: lglocks-rt.patch
|
|
From: Thomas Gleixner <tglx@linutronix.de>
|
|
Date: Wed, 15 Jun 2011 11:02:21 +0200
|
|
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
---
|
|
include/linux/lglock.h | 99 +++++++++++++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 99 insertions(+)
|
|
|
|
Index: linux-3.2/include/linux/lglock.h
|
|
===================================================================
|
|
--- linux-3.2.orig/include/linux/lglock.h
|
|
+++ linux-3.2/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
|