linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Thomas Gleixner <tglx@linutronix.de>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@kernel.org>,
	Juri Lelli <juri.lelli@redhat.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Daniel Bristot de Oliveira <bristot@redhat.com>,
	Will Deacon <will@kernel.org>, Waiman Long <longman@redhat.com>,
	Boqun Feng <boqun.feng@gmail.com>,
	Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
	Davidlohr Bueso <dave@stgolabs.net>,
	Mike Galbraith <efault@gmx.de>
Subject: [patch V3 49/64] locking/ww_mutex: Add rt_mutex based lock type and accessors
Date: Thu, 05 Aug 2021 17:13:49 +0200	[thread overview]
Message-ID: <20210805153955.652772788@linutronix.de> (raw)
In-Reply-To: 20210805151300.330412127@linutronix.de

From: Peter Zijlstra <peterz@infradead.org>

Provide the defines for RT mutex based ww_mutexes and fixup the debug logic
so it's either enabled by DEBUG_MUTEXES or DEBUG_RT_MUTEXES on RT kernels.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

---
 include/linux/ww_mutex.h  |   33 ++++++++++++++++++++++++---------
 kernel/locking/ww_mutex.h |    6 +++---
 2 files changed, 27 insertions(+), 12 deletions(-)
---
--- a/include/linux/ww_mutex.h
+++ b/include/linux/ww_mutex.h
@@ -18,11 +18,24 @@
 #define __LINUX_WW_MUTEX_H
 
 #include <linux/mutex.h>
+#include <linux/rtmutex.h>
 
+#if defined(CONFIG_DEBUG_MUTEXES) || \
+   (defined(CONFIG_PREEMPT_RT) && defined(CONFIG_DEBUG_RT_MUTEXES))
+#define DEBUG_WW_MUTEXES
+#endif
+
+#ifndef CONFIG_PREEMPT_RT
 #define WW_MUTEX_BASE			mutex
 #define ww_mutex_base_init(l,n,k)	__mutex_init(l,n,k)
 #define ww_mutex_base_trylock(l)	mutex_trylock(l)
 #define ww_mutex_base_is_locked(b)	mutex_is_locked((b))
+#else
+#define WW_MUTEX_BASE			rt_mutex
+#define ww_mutex_base_init(l,n,k)	__rt_mutex_init(l,n,k)
+#define ww_mutex_base_trylock(l)	rt_mutex_trylock(l)
+#define ww_mutex_base_is_locked(b)	rt_mutex_base_is_locked(&(b)->rtmutex)
+#endif
 
 struct ww_class {
 	atomic_long_t stamp;
@@ -36,7 +49,7 @@ struct ww_class {
 struct ww_mutex {
 	struct WW_MUTEX_BASE base;
 	struct ww_acquire_ctx *ctx;
-#ifdef CONFIG_DEBUG_MUTEXES
+#ifdef DEBUG_WW_MUTEXES
 	struct ww_class *ww_class;
 #endif
 };
@@ -47,10 +60,10 @@ struct ww_acquire_ctx {
 	unsigned int acquired;
 	unsigned short wounded;
 	unsigned short is_wait_die;
-#ifdef CONFIG_DEBUG_MUTEXES
+#ifdef DEBUG_WW_MUTEXES
 	unsigned int done_acquire;
 	struct ww_class *ww_class;
-	struct ww_mutex *contending_lock;
+	void *contending_lock;
 #endif
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
 	struct lockdep_map dep_map;
@@ -89,7 +102,7 @@ static inline void ww_mutex_init(struct
 {
 	ww_mutex_base_init(&lock->base, ww_class->mutex_name, &ww_class->mutex_key);
 	lock->ctx = NULL;
-#ifdef CONFIG_DEBUG_MUTEXES
+#ifdef DEBUG_WW_MUTEXES
 	lock->ww_class = ww_class;
 #endif
 }
@@ -126,7 +139,7 @@ static inline void ww_acquire_init(struc
 	ctx->acquired = 0;
 	ctx->wounded = false;
 	ctx->is_wait_die = ww_class->is_wait_die;
-#ifdef CONFIG_DEBUG_MUTEXES
+#ifdef DEBUG_WW_MUTEXES
 	ctx->ww_class = ww_class;
 	ctx->done_acquire = 0;
 	ctx->contending_lock = NULL;
@@ -156,7 +169,7 @@ static inline void ww_acquire_init(struc
  */
 static inline void ww_acquire_done(struct ww_acquire_ctx *ctx)
 {
-#ifdef CONFIG_DEBUG_MUTEXES
+#ifdef DEBUG_WW_MUTEXES
 	lockdep_assert_held(ctx);
 
 	DEBUG_LOCKS_WARN_ON(ctx->done_acquire);
@@ -176,7 +189,7 @@ static inline void ww_acquire_fini(struc
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
 	mutex_release(&ctx->dep_map, _THIS_IP_);
 #endif
-#ifdef CONFIG_DEBUG_MUTEXES
+#ifdef DEBUG_WW_MUTEXES
 	DEBUG_LOCKS_WARN_ON(ctx->acquired);
 	if (!IS_ENABLED(CONFIG_PROVE_LOCKING))
 		/*
@@ -282,7 +295,7 @@ static inline void
 ww_mutex_lock_slow(struct ww_mutex *lock, struct ww_acquire_ctx *ctx)
 {
 	int ret;
-#ifdef CONFIG_DEBUG_MUTEXES
+#ifdef DEBUG_WW_MUTEXES
 	DEBUG_LOCKS_WARN_ON(!ctx->contending_lock);
 #endif
 	ret = ww_mutex_lock(lock, ctx);
@@ -318,7 +331,7 @@ static inline int __must_check
 ww_mutex_lock_slow_interruptible(struct ww_mutex *lock,
 				 struct ww_acquire_ctx *ctx)
 {
-#ifdef CONFIG_DEBUG_MUTEXES
+#ifdef DEBUG_WW_MUTEXES
 	DEBUG_LOCKS_WARN_ON(!ctx->contending_lock);
 #endif
 	return ww_mutex_lock_interruptible(lock, ctx);
@@ -348,7 +361,9 @@ static inline int __must_check ww_mutex_
  */
 static inline void ww_mutex_destroy(struct ww_mutex *lock)
 {
+#ifndef CONFIG_PREEMPT_RT
 	mutex_destroy(&lock->base);
+#endif
 }
 
 /**
--- a/kernel/locking/ww_mutex.h
+++ b/kernel/locking/ww_mutex.h
@@ -180,7 +180,7 @@ static inline void lockdep_assert_wait_l
 static __always_inline void
 ww_mutex_lock_acquired(struct ww_mutex *ww, struct ww_acquire_ctx *ww_ctx)
 {
-#ifdef CONFIG_DEBUG_MUTEXES
+#ifdef DEBUG_WW_MUTEXES
 	/*
 	 * If this WARN_ON triggers, you used ww_mutex_lock to acquire,
 	 * but released with a normal mutex_unlock in this call.
@@ -413,7 +413,7 @@ static __always_inline int
 __ww_mutex_kill(struct MUTEX *lock, struct ww_acquire_ctx *ww_ctx)
 {
 	if (ww_ctx->acquired > 0) {
-#ifdef CONFIG_DEBUG_MUTEXES
+#ifdef DEBUG_WW_MUTEXES
 		struct ww_mutex *ww;
 
 		ww = container_of(lock, struct ww_mutex, base);
@@ -559,7 +559,7 @@ static inline int
 static inline void __ww_mutex_unlock(struct ww_mutex *lock)
 {
 	if (lock->ctx) {
-#ifdef CONFIG_DEBUG_MUTEXES
+#ifdef DEBUG_WW_MUTEXES
 		DEBUG_LOCKS_WARN_ON(!lock->ctx->acquired);
 #endif
 		if (lock->ctx->acquired > 0)


  parent reply	other threads:[~2021-08-05 15:45 UTC|newest]

Thread overview: 79+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-05 15:13 [patch V3 00/64] locking, sched: The PREEMPT-RT locking infrastructure Thomas Gleixner
2021-08-05 15:13 ` [patch V3 01/64] sched: Split out the wakeup state check Thomas Gleixner
2021-08-05 15:13 ` [patch V3 02/64] sched: Introduce TASK_RTLOCK_WAIT Thomas Gleixner
2021-08-05 15:13 ` [patch V3 03/64] sched: Reorganize current::__state helpers Thomas Gleixner
2021-08-05 15:13 ` [patch V3 04/64] sched: Prepare for RT sleeping spin/rwlocks Thomas Gleixner
2021-08-05 15:13 ` [patch V3 05/64] sched: Rework the __schedule() preempt argument Thomas Gleixner
2021-08-05 15:13 ` [patch V3 06/64] sched: Provide schedule point for RT locks Thomas Gleixner
2021-08-05 15:13 ` [patch V3 07/64] sched/wake_q: Provide WAKE_Q_HEAD_INITIALIZER Thomas Gleixner
2021-08-05 15:13 ` [patch V3 08/64] media/atomisp: Use lockdep instead of *mutex_is_locked() Thomas Gleixner
2021-08-05 15:13 ` [patch V3 09/64] rtmutex: Remove rt_mutex_is_locked() Thomas Gleixner
2021-08-05 15:13 ` [patch V3 10/64] rtmutex: Convert macros to inlines Thomas Gleixner
2021-08-05 15:13 ` [patch V3 11/64] rtmutex: Switch to try_cmpxchg() Thomas Gleixner
2021-08-05 15:13 ` [patch V3 12/64] rtmutex: Split API and implementation Thomas Gleixner
2021-08-05 15:13 ` [patch V3 13/64] rtmutex: Split out the inner parts of struct rtmutex Thomas Gleixner
2021-08-05 15:13 ` [patch V3 14/64] locking/rtmutex: Provide rt_mutex_slowlock_locked() Thomas Gleixner
2021-08-05 15:13 ` [patch V3 15/64] rtmutex: Provide rt_mutex_base_is_locked() Thomas Gleixner
2021-08-08 20:41   ` Davidlohr Bueso
2021-08-09 10:18     ` Thomas Gleixner
2021-08-05 15:13 ` [patch V3 16/64] locking: Add base code for RT rw_semaphore and rwlock Thomas Gleixner
2021-08-05 15:13 ` [patch V3 17/64] locking/rwsem: Add rtmutex based R/W semaphore implementation Thomas Gleixner
2021-08-05 15:13 ` [patch V3 18/64] locking/rtmutex: Add wake_state to rt_mutex_waiter Thomas Gleixner
2021-08-05 15:13 ` [patch V3 19/64] locking/rtmutex: Provide rt_wake_q and helpers Thomas Gleixner
2021-08-05 15:13 ` [patch V3 20/64] locking/rtmutex: Use rt_mutex_wake_q_head Thomas Gleixner
2021-08-05 15:13 ` [patch V3 21/64] locking/rtmutex: Prepare RT rt_mutex_wake_q for RT locks Thomas Gleixner
2021-08-05 15:13 ` [patch V3 22/64] locking/rtmutex: Guard regular sleeping locks specific functions Thomas Gleixner
2021-08-05 15:13 ` [patch V3 23/64] locking/spinlock: Split the lock types header Thomas Gleixner
2021-08-05 15:13 ` [patch V3 24/64] locking/rtmutex: Prevent future include recursion hell Thomas Gleixner
2021-08-05 15:13 ` [patch V3 25/64] locking/lockdep: Reduce includes in debug_locks.h Thomas Gleixner
2021-08-05 15:13 ` [patch V3 26/64] rbtree: Split out the rbtree type definitions Thomas Gleixner
2021-08-05 15:13 ` [patch V3 27/64] locking/rtmutex: Include only rbtree types Thomas Gleixner
2021-08-05 15:13 ` [patch V3 28/64] locking/spinlock: Provide RT specific spinlock type Thomas Gleixner
2021-08-05 15:13 ` [patch V3 29/64] locking/spinlock: Provide RT variant header Thomas Gleixner
2021-08-05 15:13 ` [patch V3 30/64] locking/rtmutex: Provide the spin/rwlock core lock function Thomas Gleixner
2021-08-05 15:13 ` [patch V3 31/64] locking/spinlock: Provide RT variant Thomas Gleixner
2021-08-05 15:13 ` [patch V3 32/64] locking/rwlock: " Thomas Gleixner
2021-08-05 15:13 ` [patch V3 33/64] locking/mutex: Consolidate core headers Thomas Gleixner
2021-08-05 15:13 ` [patch V3 34/64] locking/mutex: Move waiter to core header Thomas Gleixner
2021-08-05 15:13 ` [patch V3 35/64] locking/ww_mutex: Move ww_mutex declarations into ww_mutex.h Thomas Gleixner
2021-08-05 15:13 ` [patch V3 36/64] locking/mutex: Make mutex::wait_lock raw Thomas Gleixner
2021-08-05 15:13 ` [patch V3 37/64] locking/ww_mutex: Simplify lockdep annotation Thomas Gleixner
2021-08-05 15:13 ` [patch V3 38/64] locking/ww_mutex: Gather mutex_waiter initialization Thomas Gleixner
2021-08-05 15:13 ` [patch V3 39/64] locking/ww_mutex: Split up ww_mutex_unlock() Thomas Gleixner
2021-08-05 15:13 ` [patch V3 40/64] locking/ww_mutex: Split W/W implementation logic Thomas Gleixner
2021-08-05 15:13 ` [patch V3 41/64] locking/ww_mutex: Remove __sched annotation Thomas Gleixner
2021-08-05 15:13 ` [patch V3 42/64] locking/ww_mutex: Abstract waiter iteration Thomas Gleixner
2021-08-05 15:13 ` [patch V3 43/64] locking/ww_mutex: Abstract waiter enqueueing Thomas Gleixner
2021-08-05 15:13 ` [patch V3 44/64] locking/ww_mutex: Abstract mutex accessors Thomas Gleixner
2021-08-05 15:13 ` [patch V3 45/64] locking/ww_mutex: Abstract mutex types Thomas Gleixner
2021-08-05 15:13 ` [patch V3 46/64] locking/ww_mutex: Abstract internal lock access Thomas Gleixner
2021-08-05 15:13 ` [patch V3 47/64] locking/ww_mutex: Implement rt_mutex accessors Thomas Gleixner
2021-08-05 15:13 ` [patch V3 48/64] locking/ww_mutex: Add RT priority to W/W order Thomas Gleixner
2021-08-06 10:48   ` Peter Zijlstra
2021-08-06 11:50     ` Thomas Gleixner
2021-08-05 15:13 ` Thomas Gleixner [this message]
2021-08-05 15:13 ` [patch V3 50/64] locking/rtmutex: Extend the rtmutex core to support ww_mutex Thomas Gleixner
2021-08-06 11:00   ` Peter Zijlstra
2021-08-06 11:19     ` Thomas Gleixner
2021-08-06 13:48     ` Peter Zijlstra
2021-08-07 20:07       ` Thomas Gleixner
2021-08-05 15:13 ` [patch V3 51/64] locking/ww_mutex: Implement rtmutex based ww_mutex API functions Thomas Gleixner
2021-08-05 15:13 ` [patch V3 52/64] locking/rtmutex: Add mutex variant for RT Thomas Gleixner
2021-08-05 15:13 ` [patch V3 53/64] lib/test_lockup: Adapt to changed variables Thomas Gleixner
2021-08-05 15:13 ` [patch V3 54/64] futex: Validate waiter correctly in futex_proxy_trylock_atomic() Thomas Gleixner
2021-08-05 15:13 ` [patch V3 55/64] futex: Cleanup stale comments Thomas Gleixner
2021-08-05 15:13 ` [patch V3 56/64] futex: Correct the number of requeued waiters for PI Thomas Gleixner
2021-08-08 17:05   ` Davidlohr Bueso
2021-08-09  8:18     ` Thomas Gleixner
2021-08-09 10:52       ` Thomas Gleixner
2021-08-05 15:13 ` [patch V3 57/64] futex: Restructure futex_requeue() Thomas Gleixner
2021-08-05 15:13 ` [patch V3 58/64] futex: Clarify comment in futex_requeue() Thomas Gleixner
2021-08-08 18:43   ` Davidlohr Bueso
2021-08-09  8:18     ` Thomas Gleixner
2021-08-05 15:13 ` [patch V3 59/64] futex: Simplify handle_early_requeue_pi_wakeup() Thomas Gleixner
2021-08-05 15:14 ` [patch V3 60/64] futex: Prevent requeue_pi() lock nesting issue on RT Thomas Gleixner
2021-08-05 15:14 ` [patch V3 61/64] rtmutex: Prevent lockdep false positive with PI futexes Thomas Gleixner
2021-08-05 15:14 ` [patch V3 62/64] preempt: Adjust PREEMPT_LOCK_OFFSET for RT Thomas Gleixner
2021-08-05 15:14 ` [patch V3 63/64] locking/rtmutex: Implement equal priority lock stealing Thomas Gleixner
2021-08-05 15:14 ` [patch V3 64/64] locking/rtmutex: Add adaptive spinwait mechanism Thomas Gleixner
2021-08-09 20:28   ` Davidlohr Bueso

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210805153955.652772788@linutronix.de \
    --to=tglx@linutronix.de \
    --cc=bigeasy@linutronix.de \
    --cc=boqun.feng@gmail.com \
    --cc=bristot@redhat.com \
    --cc=dave@stgolabs.net \
    --cc=efault@gmx.de \
    --cc=juri.lelli@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=longman@redhat.com \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).