| Subject: rt-add-rt-spinlocks.patch |
| From: Thomas Gleixner <tglx@linutronix.de> |
| Date: Wed, 29 Jun 2011 19:43:35 +0200 |
| |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| --- |
| include/linux/rwlock_types_rt.h | 33 +++++++++++++++++++++++++ |
| include/linux/spinlock_types.h | 11 ++++++-- |
| include/linux/spinlock_types_rt.h | 49 ++++++++++++++++++++++++++++++++++++++ |
| 3 files changed, 90 insertions(+), 3 deletions(-) |
| |
| --- /dev/null |
| +++ b/include/linux/rwlock_types_rt.h |
| @@ -0,0 +1,33 @@ |
| +#ifndef __LINUX_RWLOCK_TYPES_RT_H |
| +#define __LINUX_RWLOCK_TYPES_RT_H |
| + |
| +#ifndef __LINUX_SPINLOCK_TYPES_H |
| +#error "Do not include directly. Include spinlock_types.h instead" |
| +#endif |
| + |
| +/* |
| + * rwlocks - rtmutex which allows single reader recursion |
| + */ |
| +typedef struct { |
| + struct rt_mutex lock; |
| + int read_depth; |
| + unsigned int break_lock; |
| +#ifdef CONFIG_DEBUG_LOCK_ALLOC |
| + struct lockdep_map dep_map; |
| +#endif |
| +} rwlock_t; |
| + |
| +#ifdef CONFIG_DEBUG_LOCK_ALLOC |
| +# define RW_DEP_MAP_INIT(lockname) .dep_map = { .name = #lockname } |
| +#else |
| +# define RW_DEP_MAP_INIT(lockname) |
| +#endif |
| + |
| +#define __RW_LOCK_UNLOCKED(name) \ |
| + { .lock = __RT_MUTEX_INITIALIZER_SAVE_STATE(name.lock), \ |
| + RW_DEP_MAP_INIT(name) } |
| + |
| +#define DEFINE_RWLOCK(name) \ |
| + rwlock_t name __cacheline_aligned_in_smp = __RW_LOCK_UNLOCKED(name) |
| + |
| +#endif |
| --- a/include/linux/spinlock_types.h |
| +++ b/include/linux/spinlock_types.h |
| @@ -11,8 +11,13 @@ |
| |
| #include <linux/spinlock_types_raw.h> |
| |
| -#include <linux/spinlock_types_nort.h> |
| - |
| -#include <linux/rwlock_types.h> |
| +#ifndef CONFIG_PREEMPT_RT_FULL |
| +# include <linux/spinlock_types_nort.h> |
| +# include <linux/rwlock_types.h> |
| +#else |
| +# include <linux/rtmutex.h> |
| +# include <linux/spinlock_types_rt.h> |
| +# include <linux/rwlock_types_rt.h> |
| +#endif |
| |
| #endif /* __LINUX_SPINLOCK_TYPES_H */ |
| --- /dev/null |
| +++ b/include/linux/spinlock_types_rt.h |
| @@ -0,0 +1,49 @@ |
| +#ifndef __LINUX_SPINLOCK_TYPES_RT_H |
| +#define __LINUX_SPINLOCK_TYPES_RT_H |
| + |
| +#ifndef __LINUX_SPINLOCK_TYPES_H |
| +#error "Do not include directly. Include spinlock_types.h instead" |
| +#endif |
| + |
| +/* |
| + * PREEMPT_RT: spinlocks - an RT mutex plus lock-break field: |
| + */ |
| +typedef struct spinlock { |
| + struct rt_mutex lock; |
| + unsigned int break_lock; |
| +#ifdef CONFIG_DEBUG_LOCK_ALLOC |
| + struct lockdep_map dep_map; |
| +#endif |
| +} spinlock_t; |
| + |
| +#ifdef CONFIG_DEBUG_RT_MUTEXES |
| +# define __RT_SPIN_INITIALIZER(name) \ |
| + { \ |
| + .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock), \ |
| + .save_state = 1, \ |
| + .file = __FILE__, \ |
| + .line = __LINE__ , \ |
| + } |
| +#else |
| +# define __RT_SPIN_INITIALIZER(name) \ |
| + { \ |
| + .wait_lock = __RAW_SPIN_LOCK_UNLOCKED(name.wait_lock), \ |
| + .save_state = 1, \ |
| + } |
| +#endif |
| + |
| +/* |
| +.wait_list = PLIST_HEAD_INIT_RAW((name).lock.wait_list, (name).lock.wait_lock) |
| +*/ |
| + |
| +#define __SPIN_LOCK_UNLOCKED(name) \ |
| + { .lock = __RT_SPIN_INITIALIZER(name.lock), \ |
| + SPIN_DEP_MAP_INIT(name) } |
| + |
| +#define __DEFINE_SPINLOCK(name) \ |
| + spinlock_t name = __SPIN_LOCK_UNLOCKED(name) |
| + |
| +#define DEFINE_SPINLOCK(name) \ |
| + spinlock_t name __cacheline_aligned_in_smp = __SPIN_LOCK_UNLOCKED(name) |
| + |
| +#endif |