blob: 2cc908b13bd08fd8697e4ddd7a8a1c92a089a5a7 [file] [log] [blame]
Subject: rt/locking: Consolidate rwlock variants
From: Thomas Gleixner <tglx@linutronix.de>
Date: Fri, 28 Jul 2017 15:55:41 +0200
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
kernel/locking/rt.c | 85 ------------------------------------
kernel/locking/rwlock-rt.c | 104 ++++++++++++++++++++++++++++++++++++++++-----
2 files changed, 94 insertions(+), 95 deletions(-)
--- a/kernel/locking/rt.c
+++ b/kernel/locking/rt.c
@@ -198,91 +198,6 @@ void __lockfunc _mutex_unlock(struct mut
}
EXPORT_SYMBOL(_mutex_unlock);
-#ifndef CONFIG_RWLOCK_RT_READER_BIASED
-/*
- * rwlock_t functions
- */
-int __lockfunc rt_write_trylock(rwlock_t *rwlock)
-{
- int ret;
-
- migrate_disable();
- ret = rt_mutex_trylock(&rwlock->lock);
- if (ret)
- rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_);
- else
- migrate_enable();
- return ret;
-}
-EXPORT_SYMBOL(rt_write_trylock);
-
-int __lockfunc rt_read_trylock(rwlock_t *rwlock)
-{
- struct rt_mutex *lock = &rwlock->lock;
- int ret;
-
- migrate_disable();
- ret = rt_mutex_trylock(lock);
- if (ret)
- rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_);
- else
- migrate_enable();
- return ret;
-}
-EXPORT_SYMBOL(rt_read_trylock);
-
-void __lockfunc rt_write_lock(rwlock_t *rwlock)
-{
- migrate_disable();
- rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_);
- __rt_spin_lock(&rwlock->lock);
-}
-EXPORT_SYMBOL(rt_write_lock);
-
-void __lockfunc rt_read_lock(rwlock_t *rwlock)
-{
- struct rt_mutex *lock = &rwlock->lock;
-
- migrate_disable();
- rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_);
- __rt_spin_lock(lock);
-}
-
-EXPORT_SYMBOL(rt_read_lock);
-
-void __lockfunc rt_write_unlock(rwlock_t *rwlock)
-{
- /* NOTE: we always pass in '1' for nested, for simplicity */
- rwlock_release(&rwlock->dep_map, 1, _RET_IP_);
- __rt_spin_unlock(&rwlock->lock);
- migrate_enable();
-}
-EXPORT_SYMBOL(rt_write_unlock);
-
-void __lockfunc rt_read_unlock(rwlock_t *rwlock)
-{
- rwlock_release(&rwlock->dep_map, 1, _RET_IP_);
- __rt_spin_unlock(&rwlock->lock);
- migrate_enable();
-}
-EXPORT_SYMBOL(rt_read_unlock);
-
-void __rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key)
-{
- rt_mutex_init(&rwlock->lock);
-
-#ifdef CONFIG_DEBUG_LOCK_ALLOC
- /*
- * Make sure we are not reinitializing a held lock:
- */
- debug_check_no_locks_freed((void *)rwlock, sizeof(*rwlock));
- lockdep_init_map(&rwlock->dep_map, name, key, 0);
-#endif
- rwlock->lock.save_state = 1;
-}
-EXPORT_SYMBOL(__rt_rwlock_init);
-#endif
-
/**
* atomic_dec_and_mutex_lock - return holding mutex if we dec to 0
* @cnt: the atomic which we are to dec
--- a/kernel/locking/rwlock-rt.c
+++ b/kernel/locking/rwlock-rt.c
@@ -245,14 +245,100 @@ void __write_rt_unlock(struct rt_rw_lock
__write_unlock_common(lock, WRITER_BIAS, flags);
}
-#ifdef CONFIG_RWLOCK_RT_READER_BIASED
+#ifndef CONFIG_RWLOCK_RT_READER_BIASED
+/* Map the single reader implementation */
+static inline int do_read_rt_trylock(rwlock_t *rwlock)
+{
+ return rt_mutex_trylock(&rwlock->lock);
+}
+
+static inline int do_write_rt_trylock(rwlock_t *rwlock)
+{
+ return rt_mutex_trylock(&rwlock->lock);
+}
+
+static inline void do_read_rt_lock(rwlock_t *rwlock)
+{
+ __rt_spin_lock(&rwlock->lock);
+}
+
+static inline void do_write_rt_lock(rwlock_t *rwlock)
+{
+ __rt_spin_lock(&rwlock->lock);
+}
+
+static inline void do_read_rt_unlock(rwlock_t *rwlock)
+{
+ __rt_spin_unlock(&rwlock->lock);
+}
+static inline void do_write_rt_unlock(rwlock_t *rwlock)
+{
+ __rt_spin_unlock(&rwlock->lock);
+}
+
+static inline void do_rwlock_rt_init(rwlock_t *rwlock, const char *name,
+ struct lock_class_key *key)
+{
+#ifdef CONFIG_DEBUG_LOCK_ALLOC
+ /*
+ * Make sure we are not reinitializing a held lock:
+ */
+ debug_check_no_locks_freed((void *)rwlock, sizeof(*rwlock));
+ lockdep_init_map(&rwlock->dep_map, name, key, 0);
+#endif
+ rt_mutex_init(&rwlock->lock);
+ rwlock->lock.save_state = 1;
+}
+
+#else
+/* Map the reader biased implementation */
+static inline int do_read_rt_trylock(rwlock_t *rwlock)
+{
+ return __read_rt_trylock(rwlock);
+}
+
+static inline int do_write_rt_trylock(rwlock_t *rwlock)
+{
+ return __write_rt_trylock(rwlock);
+}
+
+static inline void do_read_rt_lock(rwlock_t *rwlock)
+{
+ __read_rt_lock(rwlock);
+}
+
+static inline void do_write_rt_lock(rwlock_t *rwlock)
+{
+ __write_rt_lock(rwlock);
+}
+
+static inline void do_read_rt_unlock(rwlock_t *rwlock)
+{
+ __read_rt_unlock(rwlock);
+}
+
+static inline void do_write_rt_unlock(rwlock_t *rwlock)
+{
+ __write_rt_unlock(rwlock);
+}
+
+static inline void do_rwlock_rt_init(rwlock_t *rwlock, const char *name,
+ struct lock_class_key *key)
+{
+ __rwlock_biased_rt_init(rwlock, name, key);
+}
+#endif
+
+/*
+ * The common functions which get wrapped into the rwlock API.
+ */
int __lockfunc rt_read_trylock(rwlock_t *rwlock)
{
int ret;
migrate_disable();
- ret = __read_rt_trylock(rwlock);
+ ret = do_read_rt_trylock(rwlock);
if (ret)
rwlock_acquire_read(&rwlock->dep_map, 0, 1, _RET_IP_);
else
@@ -266,7 +352,7 @@ int __lockfunc rt_write_trylock(rwlock_t
int ret;
migrate_disable();
- ret = __write_rt_trylock(rwlock);
+ ret = do_write_rt_trylock(rwlock);
if (ret)
rwlock_acquire(&rwlock->dep_map, 0, 1, _RET_IP_);
else
@@ -279,7 +365,7 @@ void __lockfunc rt_read_lock(rwlock_t *r
{
migrate_disable();
rwlock_acquire_read(&rwlock->dep_map, 0, 0, _RET_IP_);
- __read_rt_lock(rwlock);
+ do_read_rt_lock(rwlock);
}
EXPORT_SYMBOL(rt_read_lock);
@@ -287,14 +373,14 @@ void __lockfunc rt_write_lock(rwlock_t *
{
migrate_disable();
rwlock_acquire(&rwlock->dep_map, 0, 0, _RET_IP_);
- __write_rt_lock(rwlock);
+ do_write_rt_lock(rwlock);
}
EXPORT_SYMBOL(rt_write_lock);
void __lockfunc rt_read_unlock(rwlock_t *rwlock)
{
rwlock_release(&rwlock->dep_map, 1, _RET_IP_);
- __read_rt_unlock(rwlock);
+ do_read_rt_unlock(rwlock);
migrate_enable();
}
EXPORT_SYMBOL(rt_read_unlock);
@@ -302,15 +388,13 @@ EXPORT_SYMBOL(rt_read_unlock);
void __lockfunc rt_write_unlock(rwlock_t *rwlock)
{
rwlock_release(&rwlock->dep_map, 1, _RET_IP_);
- __write_rt_unlock(rwlock);
+ do_write_rt_unlock(rwlock);
migrate_enable();
}
EXPORT_SYMBOL(rt_write_unlock);
void __rt_rwlock_init(rwlock_t *rwlock, char *name, struct lock_class_key *key)
{
- __rwlock_biased_rt_init(rwlock, name, key);
+ do_rwlock_rt_init(rwlock, name, key);
}
EXPORT_SYMBOL(__rt_rwlock_init);
-
-#endif