All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	patches@lists.linux.dev, Henry Wu <triangletrap12@gmail.com>,
	"Peter Zijlstra (Intel)" <peterz@infradead.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Sasha Levin <sashal@kernel.org>
Subject: [PATCH 5.15 138/155] locking/rtmutex: Fix task->pi_waiters integrity
Date: Tue,  1 Aug 2023 11:20:50 +0200	[thread overview]
Message-ID: <20230801091915.077461867@linuxfoundation.org> (raw)
In-Reply-To: <20230801091910.165050260@linuxfoundation.org>

From: Peter Zijlstra <peterz@infradead.org>

[ Upstream commit f7853c34241807bb97673a5e97719123be39a09e ]

Henry reported that rt_mutex_adjust_prio_check() has an ordering
problem and puts the lie to the comment in [7]. Sharing the sort key
between lock->waiters and owner->pi_waiters *does* create problems,
since unlike what the comment claims, holding [L] is insufficient.

Notably, consider:

	A
      /   \
     M1   M2
     |     |
     B     C

That is, task A owns both M1 and M2, B and C block on them. In this
case a concurrent chain walk (B & C) will modify their resp. sort keys
in [7] while holding M1->wait_lock and M2->wait_lock. So holding [L]
is meaningless, they're different Ls.

This then gives rise to a race condition between [7] and [11], where
the requeue of pi_waiters will observe an inconsistent tree order.

	B				C

  (holds M1->wait_lock,		(holds M2->wait_lock,
   holds B->pi_lock)		 holds A->pi_lock)

  [7]
  waiter_update_prio();
  ...
  [8]
  raw_spin_unlock(B->pi_lock);
  ...
  [10]
  raw_spin_lock(A->pi_lock);

				[11]
				rt_mutex_enqueue_pi();
				// observes inconsistent A->pi_waiters
				// tree order

Fixing this means either extending the range of the owner lock from
[10-13] to [6-13], with the immediate problem that this means [6-8]
hold both blocked and owner locks, or duplicating the sort key.

Since the locking in chain walk is horrible enough without having to
consider pi_lock nesting rules, duplicate the sort key instead.

By giving each tree their own sort key, the above race becomes
harmless, if C sees B at the old location, then B will correct things
(if they need correcting) when it walks up the chain and reaches A.

Fixes: fb00aca47440 ("rtmutex: Turn the plist into an rb-tree")
Reported-by: Henry Wu <triangletrap12@gmail.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Henry Wu <triangletrap12@gmail.com>
Link: https://lkml.kernel.org/r/20230707161052.GF2883469%40hirez.programming.kicks-ass.net
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 kernel/locking/rtmutex.c        | 170 +++++++++++++++++++++-----------
 kernel/locking/rtmutex_api.c    |   2 +-
 kernel/locking/rtmutex_common.h |  47 ++++++---
 kernel/locking/ww_mutex.h       |  12 +--
 4 files changed, 155 insertions(+), 76 deletions(-)

diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c
index b7fa3ee3aa1de..ee5be1dda0c40 100644
--- a/kernel/locking/rtmutex.c
+++ b/kernel/locking/rtmutex.c
@@ -331,21 +331,43 @@ static __always_inline int __waiter_prio(struct task_struct *task)
 	return prio;
 }
 
+/*
+ * Update the waiter->tree copy of the sort keys.
+ */
 static __always_inline void
 waiter_update_prio(struct rt_mutex_waiter *waiter, struct task_struct *task)
 {
-	waiter->prio = __waiter_prio(task);
-	waiter->deadline = task->dl.deadline;
+	lockdep_assert_held(&waiter->lock->wait_lock);
+	lockdep_assert(RB_EMPTY_NODE(&waiter->tree.entry));
+
+	waiter->tree.prio = __waiter_prio(task);
+	waiter->tree.deadline = task->dl.deadline;
+}
+
+/*
+ * Update the waiter->pi_tree copy of the sort keys (from the tree copy).
+ */
+static __always_inline void
+waiter_clone_prio(struct rt_mutex_waiter *waiter, struct task_struct *task)
+{
+	lockdep_assert_held(&waiter->lock->wait_lock);
+	lockdep_assert_held(&task->pi_lock);
+	lockdep_assert(RB_EMPTY_NODE(&waiter->pi_tree.entry));
+
+	waiter->pi_tree.prio = waiter->tree.prio;
+	waiter->pi_tree.deadline = waiter->tree.deadline;
 }
 
 /*
- * Only use with rt_mutex_waiter_{less,equal}()
+ * Only use with rt_waiter_node_{less,equal}()
  */
+#define task_to_waiter_node(p)	\
+	&(struct rt_waiter_node){ .prio = __waiter_prio(p), .deadline = (p)->dl.deadline }
 #define task_to_waiter(p)	\
-	&(struct rt_mutex_waiter){ .prio = __waiter_prio(p), .deadline = (p)->dl.deadline }
+	&(struct rt_mutex_waiter){ .tree = *task_to_waiter_node(p) }
 
-static __always_inline int rt_mutex_waiter_less(struct rt_mutex_waiter *left,
-						struct rt_mutex_waiter *right)
+static __always_inline int rt_waiter_node_less(struct rt_waiter_node *left,
+					       struct rt_waiter_node *right)
 {
 	if (left->prio < right->prio)
 		return 1;
@@ -362,8 +384,8 @@ static __always_inline int rt_mutex_waiter_less(struct rt_mutex_waiter *left,
 	return 0;
 }
 
-static __always_inline int rt_mutex_waiter_equal(struct rt_mutex_waiter *left,
-						 struct rt_mutex_waiter *right)
+static __always_inline int rt_waiter_node_equal(struct rt_waiter_node *left,
+						 struct rt_waiter_node *right)
 {
 	if (left->prio != right->prio)
 		return 0;
@@ -383,7 +405,7 @@ static __always_inline int rt_mutex_waiter_equal(struct rt_mutex_waiter *left,
 static inline bool rt_mutex_steal(struct rt_mutex_waiter *waiter,
 				  struct rt_mutex_waiter *top_waiter)
 {
-	if (rt_mutex_waiter_less(waiter, top_waiter))
+	if (rt_waiter_node_less(&waiter->tree, &top_waiter->tree))
 		return true;
 
 #ifdef RT_MUTEX_BUILD_SPINLOCKS
@@ -391,30 +413,30 @@ static inline bool rt_mutex_steal(struct rt_mutex_waiter *waiter,
 	 * Note that RT tasks are excluded from same priority (lateral)
 	 * steals to prevent the introduction of an unbounded latency.
 	 */
-	if (rt_prio(waiter->prio) || dl_prio(waiter->prio))
+	if (rt_prio(waiter->tree.prio) || dl_prio(waiter->tree.prio))
 		return false;
 
-	return rt_mutex_waiter_equal(waiter, top_waiter);
+	return rt_waiter_node_equal(&waiter->tree, &top_waiter->tree);
 #else
 	return false;
 #endif
 }
 
 #define __node_2_waiter(node) \
-	rb_entry((node), struct rt_mutex_waiter, tree_entry)
+	rb_entry((node), struct rt_mutex_waiter, tree.entry)
 
 static __always_inline bool __waiter_less(struct rb_node *a, const struct rb_node *b)
 {
 	struct rt_mutex_waiter *aw = __node_2_waiter(a);
 	struct rt_mutex_waiter *bw = __node_2_waiter(b);
 
-	if (rt_mutex_waiter_less(aw, bw))
+	if (rt_waiter_node_less(&aw->tree, &bw->tree))
 		return 1;
 
 	if (!build_ww_mutex())
 		return 0;
 
-	if (rt_mutex_waiter_less(bw, aw))
+	if (rt_waiter_node_less(&bw->tree, &aw->tree))
 		return 0;
 
 	/* NOTE: relies on waiter->ww_ctx being set before insertion */
@@ -432,48 +454,58 @@ static __always_inline bool __waiter_less(struct rb_node *a, const struct rb_nod
 static __always_inline void
 rt_mutex_enqueue(struct rt_mutex_base *lock, struct rt_mutex_waiter *waiter)
 {
-	rb_add_cached(&waiter->tree_entry, &lock->waiters, __waiter_less);
+	lockdep_assert_held(&lock->wait_lock);
+
+	rb_add_cached(&waiter->tree.entry, &lock->waiters, __waiter_less);
 }
 
 static __always_inline void
 rt_mutex_dequeue(struct rt_mutex_base *lock, struct rt_mutex_waiter *waiter)
 {
-	if (RB_EMPTY_NODE(&waiter->tree_entry))
+	lockdep_assert_held(&lock->wait_lock);
+
+	if (RB_EMPTY_NODE(&waiter->tree.entry))
 		return;
 
-	rb_erase_cached(&waiter->tree_entry, &lock->waiters);
-	RB_CLEAR_NODE(&waiter->tree_entry);
+	rb_erase_cached(&waiter->tree.entry, &lock->waiters);
+	RB_CLEAR_NODE(&waiter->tree.entry);
 }
 
-#define __node_2_pi_waiter(node) \
-	rb_entry((node), struct rt_mutex_waiter, pi_tree_entry)
+#define __node_2_rt_node(node) \
+	rb_entry((node), struct rt_waiter_node, entry)
 
-static __always_inline bool
-__pi_waiter_less(struct rb_node *a, const struct rb_node *b)
+static __always_inline bool __pi_waiter_less(struct rb_node *a, const struct rb_node *b)
 {
-	return rt_mutex_waiter_less(__node_2_pi_waiter(a), __node_2_pi_waiter(b));
+	return rt_waiter_node_less(__node_2_rt_node(a), __node_2_rt_node(b));
 }
 
 static __always_inline void
 rt_mutex_enqueue_pi(struct task_struct *task, struct rt_mutex_waiter *waiter)
 {
-	rb_add_cached(&waiter->pi_tree_entry, &task->pi_waiters, __pi_waiter_less);
+	lockdep_assert_held(&task->pi_lock);
+
+	rb_add_cached(&waiter->pi_tree.entry, &task->pi_waiters, __pi_waiter_less);
 }
 
 static __always_inline void
 rt_mutex_dequeue_pi(struct task_struct *task, struct rt_mutex_waiter *waiter)
 {
-	if (RB_EMPTY_NODE(&waiter->pi_tree_entry))
+	lockdep_assert_held(&task->pi_lock);
+
+	if (RB_EMPTY_NODE(&waiter->pi_tree.entry))
 		return;
 
-	rb_erase_cached(&waiter->pi_tree_entry, &task->pi_waiters);
-	RB_CLEAR_NODE(&waiter->pi_tree_entry);
+	rb_erase_cached(&waiter->pi_tree.entry, &task->pi_waiters);
+	RB_CLEAR_NODE(&waiter->pi_tree.entry);
 }
 
-static __always_inline void rt_mutex_adjust_prio(struct task_struct *p)
+static __always_inline void rt_mutex_adjust_prio(struct rt_mutex_base *lock,
+						 struct task_struct *p)
 {
 	struct task_struct *pi_task = NULL;
 
+	lockdep_assert_held(&lock->wait_lock);
+	lockdep_assert(rt_mutex_owner(lock) == p);
 	lockdep_assert_held(&p->pi_lock);
 
 	if (task_has_pi_waiters(p))
@@ -562,9 +594,14 @@ static __always_inline struct rt_mutex_base *task_blocked_on_lock(struct task_st
  * Chain walk basics and protection scope
  *
  * [R] refcount on task
- * [P] task->pi_lock held
+ * [Pn] task->pi_lock held
  * [L] rtmutex->wait_lock held
  *
+ * Normal locking order:
+ *
+ *   rtmutex->wait_lock
+ *     task->pi_lock
+ *
  * Step	Description				Protected by
  *	function arguments:
  *	@task					[R]
@@ -579,27 +616,32 @@ static __always_inline struct rt_mutex_base *task_blocked_on_lock(struct task_st
  *	again:
  *	  loop_sanity_check();
  *	retry:
- * [1]	  lock(task->pi_lock);			[R] acquire [P]
- * [2]	  waiter = task->pi_blocked_on;		[P]
- * [3]	  check_exit_conditions_1();		[P]
- * [4]	  lock = waiter->lock;			[P]
- * [5]	  if (!try_lock(lock->wait_lock)) {	[P] try to acquire [L]
- *	    unlock(task->pi_lock);		release [P]
+ * [1]	  lock(task->pi_lock);			[R] acquire [P1]
+ * [2]	  waiter = task->pi_blocked_on;		[P1]
+ * [3]	  check_exit_conditions_1();		[P1]
+ * [4]	  lock = waiter->lock;			[P1]
+ * [5]	  if (!try_lock(lock->wait_lock)) {	[P1] try to acquire [L]
+ *	    unlock(task->pi_lock);		release [P1]
  *	    goto retry;
  *	  }
- * [6]	  check_exit_conditions_2();		[P] + [L]
- * [7]	  requeue_lock_waiter(lock, waiter);	[P] + [L]
- * [8]	  unlock(task->pi_lock);		release [P]
+ * [6]	  check_exit_conditions_2();		[P1] + [L]
+ * [7]	  requeue_lock_waiter(lock, waiter);	[P1] + [L]
+ * [8]	  unlock(task->pi_lock);		release [P1]
  *	  put_task_struct(task);		release [R]
  * [9]	  check_exit_conditions_3();		[L]
  * [10]	  task = owner(lock);			[L]
  *	  get_task_struct(task);		[L] acquire [R]
- *	  lock(task->pi_lock);			[L] acquire [P]
- * [11]	  requeue_pi_waiter(tsk, waiters(lock));[P] + [L]
- * [12]	  check_exit_conditions_4();		[P] + [L]
- * [13]	  unlock(task->pi_lock);		release [P]
+ *	  lock(task->pi_lock);			[L] acquire [P2]
+ * [11]	  requeue_pi_waiter(tsk, waiters(lock));[P2] + [L]
+ * [12]	  check_exit_conditions_4();		[P2] + [L]
+ * [13]	  unlock(task->pi_lock);		release [P2]
  *	  unlock(lock->wait_lock);		release [L]
  *	  goto again;
+ *
+ * Where P1 is the blocking task and P2 is the lock owner; going up one step
+ * the owner becomes the next blocked task etc..
+ *
+*
  */
 static int __sched rt_mutex_adjust_prio_chain(struct task_struct *task,
 					      enum rtmutex_chainwalk chwalk,
@@ -747,7 +789,7 @@ static int __sched rt_mutex_adjust_prio_chain(struct task_struct *task,
 	 * enabled we continue, but stop the requeueing in the chain
 	 * walk.
 	 */
-	if (rt_mutex_waiter_equal(waiter, task_to_waiter(task))) {
+	if (rt_waiter_node_equal(&waiter->tree, task_to_waiter_node(task))) {
 		if (!detect_deadlock)
 			goto out_unlock_pi;
 		else
@@ -755,13 +797,18 @@ static int __sched rt_mutex_adjust_prio_chain(struct task_struct *task,
 	}
 
 	/*
-	 * [4] Get the next lock
+	 * [4] Get the next lock; per holding task->pi_lock we can't unblock
+	 * and guarantee @lock's existence.
 	 */
 	lock = waiter->lock;
 	/*
 	 * [5] We need to trylock here as we are holding task->pi_lock,
 	 * which is the reverse lock order versus the other rtmutex
 	 * operations.
+	 *
+	 * Per the above, holding task->pi_lock guarantees lock exists, so
+	 * inverting this lock order is infeasible from a life-time
+	 * perspective.
 	 */
 	if (!raw_spin_trylock(&lock->wait_lock)) {
 		raw_spin_unlock_irq(&task->pi_lock);
@@ -865,17 +912,18 @@ static int __sched rt_mutex_adjust_prio_chain(struct task_struct *task,
 	 * or
 	 *
 	 *   DL CBS enforcement advancing the effective deadline.
-	 *
-	 * Even though pi_waiters also uses these fields, and that tree is only
-	 * updated in [11], we can do this here, since we hold [L], which
-	 * serializes all pi_waiters access and rb_erase() does not care about
-	 * the values of the node being removed.
 	 */
 	waiter_update_prio(waiter, task);
 
 	rt_mutex_enqueue(lock, waiter);
 
-	/* [8] Release the task */
+	/*
+	 * [8] Release the (blocking) task in preparation for
+	 * taking the owner task in [10].
+	 *
+	 * Since we hold lock->waiter_lock, task cannot unblock, even if we
+	 * release task->pi_lock.
+	 */
 	raw_spin_unlock(&task->pi_lock);
 	put_task_struct(task);
 
@@ -899,7 +947,12 @@ static int __sched rt_mutex_adjust_prio_chain(struct task_struct *task,
 		return 0;
 	}
 
-	/* [10] Grab the next task, i.e. the owner of @lock */
+	/*
+	 * [10] Grab the next task, i.e. the owner of @lock
+	 *
+	 * Per holding lock->wait_lock and checking for !owner above, there
+	 * must be an owner and it cannot go away.
+	 */
 	task = get_task_struct(rt_mutex_owner(lock));
 	raw_spin_lock(&task->pi_lock);
 
@@ -912,8 +965,9 @@ static int __sched rt_mutex_adjust_prio_chain(struct task_struct *task,
 		 * and adjust the priority of the owner.
 		 */
 		rt_mutex_dequeue_pi(task, prerequeue_top_waiter);
+		waiter_clone_prio(waiter, task);
 		rt_mutex_enqueue_pi(task, waiter);
-		rt_mutex_adjust_prio(task);
+		rt_mutex_adjust_prio(lock, task);
 
 	} else if (prerequeue_top_waiter == waiter) {
 		/*
@@ -928,8 +982,9 @@ static int __sched rt_mutex_adjust_prio_chain(struct task_struct *task,
 		 */
 		rt_mutex_dequeue_pi(task, waiter);
 		waiter = rt_mutex_top_waiter(lock);
+		waiter_clone_prio(waiter, task);
 		rt_mutex_enqueue_pi(task, waiter);
-		rt_mutex_adjust_prio(task);
+		rt_mutex_adjust_prio(lock, task);
 	} else {
 		/*
 		 * Nothing changed. No need to do any priority
@@ -1142,6 +1197,7 @@ static int __sched task_blocks_on_rt_mutex(struct rt_mutex_base *lock,
 	waiter->task = task;
 	waiter->lock = lock;
 	waiter_update_prio(waiter, task);
+	waiter_clone_prio(waiter, task);
 
 	/* Get the top priority waiter on the lock */
 	if (rt_mutex_has_waiters(lock))
@@ -1175,7 +1231,7 @@ static int __sched task_blocks_on_rt_mutex(struct rt_mutex_base *lock,
 		rt_mutex_dequeue_pi(owner, top_waiter);
 		rt_mutex_enqueue_pi(owner, waiter);
 
-		rt_mutex_adjust_prio(owner);
+		rt_mutex_adjust_prio(lock, owner);
 		if (owner->pi_blocked_on)
 			chain_walk = 1;
 	} else if (rt_mutex_cond_detect_deadlock(waiter, chwalk)) {
@@ -1222,6 +1278,8 @@ static void __sched mark_wakeup_next_waiter(struct rt_wake_q_head *wqh,
 {
 	struct rt_mutex_waiter *waiter;
 
+	lockdep_assert_held(&lock->wait_lock);
+
 	raw_spin_lock(&current->pi_lock);
 
 	waiter = rt_mutex_top_waiter(lock);
@@ -1234,7 +1292,7 @@ static void __sched mark_wakeup_next_waiter(struct rt_wake_q_head *wqh,
 	 * task unblocks.
 	 */
 	rt_mutex_dequeue_pi(current, waiter);
-	rt_mutex_adjust_prio(current);
+	rt_mutex_adjust_prio(lock, current);
 
 	/*
 	 * As we are waking up the top waiter, and the waiter stays
@@ -1471,7 +1529,7 @@ static void __sched remove_waiter(struct rt_mutex_base *lock,
 	if (rt_mutex_has_waiters(lock))
 		rt_mutex_enqueue_pi(owner, rt_mutex_top_waiter(lock));
 
-	rt_mutex_adjust_prio(owner);
+	rt_mutex_adjust_prio(lock, owner);
 
 	/* Store the lock on which owner is blocked or NULL */
 	next_lock = task_blocked_on_lock(owner);
diff --git a/kernel/locking/rtmutex_api.c b/kernel/locking/rtmutex_api.c
index a461be2f873db..56d1938cb52a1 100644
--- a/kernel/locking/rtmutex_api.c
+++ b/kernel/locking/rtmutex_api.c
@@ -437,7 +437,7 @@ void __sched rt_mutex_adjust_pi(struct task_struct *task)
 	raw_spin_lock_irqsave(&task->pi_lock, flags);
 
 	waiter = task->pi_blocked_on;
-	if (!waiter || rt_mutex_waiter_equal(waiter, task_to_waiter(task))) {
+	if (!waiter || rt_waiter_node_equal(&waiter->tree, task_to_waiter_node(task))) {
 		raw_spin_unlock_irqrestore(&task->pi_lock, flags);
 		return;
 	}
diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h
index c47e8361bfb5c..1162e07cdaea1 100644
--- a/kernel/locking/rtmutex_common.h
+++ b/kernel/locking/rtmutex_common.h
@@ -17,27 +17,44 @@
 #include <linux/rtmutex.h>
 #include <linux/sched/wake_q.h>
 
+
+/*
+ * This is a helper for the struct rt_mutex_waiter below. A waiter goes in two
+ * separate trees and they need their own copy of the sort keys because of
+ * different locking requirements.
+ *
+ * @entry:		rbtree node to enqueue into the waiters tree
+ * @prio:		Priority of the waiter
+ * @deadline:		Deadline of the waiter if applicable
+ *
+ * See rt_waiter_node_less() and waiter_*_prio().
+ */
+struct rt_waiter_node {
+	struct rb_node	entry;
+	int		prio;
+	u64		deadline;
+};
+
 /*
  * This is the control structure for tasks blocked on a rt_mutex,
  * which is allocated on the kernel stack on of the blocked task.
  *
- * @tree_entry:		pi node to enqueue into the mutex waiters tree
- * @pi_tree_entry:	pi node to enqueue into the mutex owner waiters tree
+ * @tree:		node to enqueue into the mutex waiters tree
+ * @pi_tree:		node to enqueue into the mutex owner waiters tree
  * @task:		task reference to the blocked task
  * @lock:		Pointer to the rt_mutex on which the waiter blocks
  * @wake_state:		Wakeup state to use (TASK_NORMAL or TASK_RTLOCK_WAIT)
- * @prio:		Priority of the waiter
- * @deadline:		Deadline of the waiter if applicable
  * @ww_ctx:		WW context pointer
+ *
+ * @tree is ordered by @lock->wait_lock
+ * @pi_tree is ordered by rt_mutex_owner(@lock)->pi_lock
  */
 struct rt_mutex_waiter {
-	struct rb_node		tree_entry;
-	struct rb_node		pi_tree_entry;
+	struct rt_waiter_node	tree;
+	struct rt_waiter_node	pi_tree;
 	struct task_struct	*task;
 	struct rt_mutex_base	*lock;
 	unsigned int		wake_state;
-	int			prio;
-	u64			deadline;
 	struct ww_acquire_ctx	*ww_ctx;
 };
 
@@ -105,7 +122,7 @@ static inline bool rt_mutex_waiter_is_top_waiter(struct rt_mutex_base *lock,
 {
 	struct rb_node *leftmost = rb_first_cached(&lock->waiters);
 
-	return rb_entry(leftmost, struct rt_mutex_waiter, tree_entry) == waiter;
+	return rb_entry(leftmost, struct rt_mutex_waiter, tree.entry) == waiter;
 }
 
 static inline struct rt_mutex_waiter *rt_mutex_top_waiter(struct rt_mutex_base *lock)
@@ -113,8 +130,10 @@ static inline struct rt_mutex_waiter *rt_mutex_top_waiter(struct rt_mutex_base *
 	struct rb_node *leftmost = rb_first_cached(&lock->waiters);
 	struct rt_mutex_waiter *w = NULL;
 
+	lockdep_assert_held(&lock->wait_lock);
+
 	if (leftmost) {
-		w = rb_entry(leftmost, struct rt_mutex_waiter, tree_entry);
+		w = rb_entry(leftmost, struct rt_mutex_waiter, tree.entry);
 		BUG_ON(w->lock != lock);
 	}
 	return w;
@@ -127,8 +146,10 @@ static inline int task_has_pi_waiters(struct task_struct *p)
 
 static inline struct rt_mutex_waiter *task_top_pi_waiter(struct task_struct *p)
 {
+	lockdep_assert_held(&p->pi_lock);
+
 	return rb_entry(p->pi_waiters.rb_leftmost, struct rt_mutex_waiter,
-			pi_tree_entry);
+			pi_tree.entry);
 }
 
 #define RT_MUTEX_HAS_WAITERS	1UL
@@ -190,8 +211,8 @@ static inline void debug_rt_mutex_free_waiter(struct rt_mutex_waiter *waiter)
 static inline void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter)
 {
 	debug_rt_mutex_init_waiter(waiter);
-	RB_CLEAR_NODE(&waiter->pi_tree_entry);
-	RB_CLEAR_NODE(&waiter->tree_entry);
+	RB_CLEAR_NODE(&waiter->pi_tree.entry);
+	RB_CLEAR_NODE(&waiter->tree.entry);
 	waiter->wake_state = TASK_NORMAL;
 	waiter->task = NULL;
 }
diff --git a/kernel/locking/ww_mutex.h b/kernel/locking/ww_mutex.h
index 56f139201f246..3ad2cc4823e59 100644
--- a/kernel/locking/ww_mutex.h
+++ b/kernel/locking/ww_mutex.h
@@ -96,25 +96,25 @@ __ww_waiter_first(struct rt_mutex *lock)
 	struct rb_node *n = rb_first(&lock->rtmutex.waiters.rb_root);
 	if (!n)
 		return NULL;
-	return rb_entry(n, struct rt_mutex_waiter, tree_entry);
+	return rb_entry(n, struct rt_mutex_waiter, tree.entry);
 }
 
 static inline struct rt_mutex_waiter *
 __ww_waiter_next(struct rt_mutex *lock, struct rt_mutex_waiter *w)
 {
-	struct rb_node *n = rb_next(&w->tree_entry);
+	struct rb_node *n = rb_next(&w->tree.entry);
 	if (!n)
 		return NULL;
-	return rb_entry(n, struct rt_mutex_waiter, tree_entry);
+	return rb_entry(n, struct rt_mutex_waiter, tree.entry);
 }
 
 static inline struct rt_mutex_waiter *
 __ww_waiter_prev(struct rt_mutex *lock, struct rt_mutex_waiter *w)
 {
-	struct rb_node *n = rb_prev(&w->tree_entry);
+	struct rb_node *n = rb_prev(&w->tree.entry);
 	if (!n)
 		return NULL;
-	return rb_entry(n, struct rt_mutex_waiter, tree_entry);
+	return rb_entry(n, struct rt_mutex_waiter, tree.entry);
 }
 
 static inline struct rt_mutex_waiter *
@@ -123,7 +123,7 @@ __ww_waiter_last(struct rt_mutex *lock)
 	struct rb_node *n = rb_last(&lock->rtmutex.waiters.rb_root);
 	if (!n)
 		return NULL;
-	return rb_entry(n, struct rt_mutex_waiter, tree_entry);
+	return rb_entry(n, struct rt_mutex_waiter, tree.entry);
 }
 
 static inline void
-- 
2.40.1




  parent reply	other threads:[~2023-08-01  9:28 UTC|newest]

Thread overview: 167+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-01  9:18 [PATCH 5.15 000/155] 5.15.124-rc1 review Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 001/155] jbd2: Fix wrongly judgement for buffer head removing while doing checkpoint Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 002/155] KVM: s390: pv: fix index value of replaced ASCE Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 003/155] io_uring: dont audit the capability check in io_uring_create() Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 004/155] gpio: tps68470: Make tps68470_gpio_output() always set the initial value Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 005/155] gpio: mvebu: Make use of devm_pwmchip_add Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 006/155] gpio: mvebu: fix irq domain leak Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 007/155] btrfs: fix race between quota disable and relocation Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 008/155] i2c: Delete error messages for failed memory allocations Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 009/155] i2c: Improve size determinations Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 010/155] i2c: nomadik: Remove unnecessary goto label Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 011/155] i2c: nomadik: Use devm_clk_get_enabled() Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 012/155] i2c: nomadik: Remove a useless call in the remove function Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 013/155] PCI/ASPM: Return 0 or -ETIMEDOUT from pcie_retrain_link() Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 014/155] PCI/ASPM: Factor out pcie_wait_for_retrain() Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 015/155] PCI/ASPM: Avoid link retraining race Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 016/155] PCI: rockchip: Remove writes to unused registers Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 017/155] PCI: rockchip: Fix window mapping and address translation for endpoint Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 018/155] PCI: rockchip: Dont advertise MSI-X in PCIe capabilities Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 019/155] dlm: cleanup plock_op vs plock_xop Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 020/155] dlm: rearrange async condition return Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 021/155] fs: dlm: interrupt posix locks only when process is killed Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 022/155] drm/ttm: Dont print error message if eviction was interrupted Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 023/155] drm/ttm: Dont leak a resource on eviction error Greg Kroah-Hartman
2023-08-01  9:18   ` Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 024/155] n_tty: Rename tail to old_tail in n_tty_read() Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 025/155] tty: fix hang on tty device with no_room set Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 026/155] drm/ttm: never consider pinned BOs for eviction&swap Greg Kroah-Hartman
2023-08-01  9:18   ` Greg Kroah-Hartman
2023-08-01  9:18 ` [PATCH 5.15 027/155] cifs: missing directory in MAINTAINERS file Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 028/155] cifs: use fs_context for automounts Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 029/155] ksmbd: remove internal.h include Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 030/155] cifs: if deferred close is disabled then close files immediately Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 031/155] pwm: meson: Simplify duplicated per-channel tracking Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 032/155] pwm: meson: fix handling of period/duty if greater than UINT_MAX Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 033/155] tracing/probes: Add symstr type for dynamic events Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 034/155] tracing/probes: Fix to avoid double count of the string length on the array Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 035/155] tracing: Allow synthetic events to pass around stacktraces Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 036/155] Revert "tracing: Add "(fault)" name injection to kernel probes" Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 037/155] tracing/probes: Fix to record 0-length data_loc in fetch_store_string*() if fails Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 038/155] scsi: qla2xxx: Remove unused declarations for qla2xxx Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 039/155] scsi: qla2xxx: Multi-que support for TMF Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 040/155] scsi: qla2xxx: Fix task management cmd failure Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 041/155] scsi: qla2xxx: Fix task management cmd fail due to unavailable resource Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 042/155] scsi: qla2xxx: Add debug prints in the device remove path Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 043/155] scsi: qla2xxx: Fix hang in task management Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 044/155] drm/amdgpu: fix vkms crtc settings Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 045/155] drm/amdgpu/vkms: relax timer deactivation by hrtimer_try_to_cancel Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 046/155] jbd2: remove t_checkpoint_io_list Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 047/155] jbd2: remove journal_clean_one_cp_list() Greg Kroah-Hartman
2023-08-01 13:09   ` Jan Kara
2023-08-02  6:46     ` Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 048/155] jbd2: fix a race when checking checkpoint buffer busy Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 049/155] phy: qcom-snps: Use dev_err_probe() to simplify code Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 050/155] phy: qcom-snps: correct struct qcom_snps_hsphy kerneldoc Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 051/155] phy: qcom-snps-femto-v2: keep cfg_ahb_clk enabled during runtime suspend Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 052/155] phy: qcom-snps-femto-v2: properly enable ref clock Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 053/155] soundwire: qcom: update status correctly with mask Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 054/155] media: staging: atomisp: select V4L2_FWNODE Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 055/155] i40e: Fix an NULL vs IS_ERR() bug for debugfs_create_dir() Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 056/155] iavf: fix potential deadlock on allocation failure Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 057/155] iavf: check for removal state before IAVF_FLAG_PF_COMMS_FAILED Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 058/155] net: phy: marvell10g: fix 88x3310 power up Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 059/155] net: hns3: fix wrong tc bandwidth weight data issue Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 060/155] net: hns3: fix wrong bw weight of disabled tc issue Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 061/155] vxlan: move to its own directory Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 062/155] vxlan: calculate correct header length for GPE Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 063/155] phy: hisilicon: Fix an out of bounds check in hisi_inno_phy_probe() Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 064/155] ethernet: atheros: fix return value check in atl1e_tso_csum() Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 065/155] ipv6 addrconf: fix bug where deleting a mngtmpaddr can create a new temporary address Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 066/155] tcp: Reduce chance of collisions in inet6_hashfn() Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 067/155] ice: Fix memory management in ice_ethtool_fdir.c Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 068/155] bonding: reset bonds flags when down link is P2P device Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 069/155] team: reset teams " Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 070/155] net: stmmac: Apply redundant write work around on 4.xx too Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 071/155] platform/x86: msi-laptop: Fix rfkill out-of-sync on MSI Wind U100 Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 072/155] igc: Fix Kernel Panic during ndo_tx_timeout callback Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 073/155] netfilter: nft_set_rbtree: fix overlap expiration walk Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 074/155] netfilter: nf_tables: skip immediate deactivate in _PREPARE_ERROR Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 075/155] netfilter: nf_tables: disallow rule addition to bound chain via NFTA_RULE_CHAIN_ID Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 076/155] net/sched: mqprio: refactor nlattr parsing to a separate function Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 077/155] net/sched: mqprio: add extack to mqprio_parse_nlattr() Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 078/155] net/sched: mqprio: Add length check for TCA_MQPRIO_{MAX/MIN}_RATE64 Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 079/155] benet: fix return value check in be_lancer_xmit_workarounds() Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 080/155] tipc: check return value of pskb_trim() Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 081/155] tipc: stop tipc crypto on failure in tipc_node_create Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 082/155] RDMA/mlx4: Make check for invalid flags stricter Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 083/155] drm/msm/dpu: drop enum dpu_core_perf_data_bus_id Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 084/155] drm/msm/adreno: Fix snapshot BINDLESS_DATA size Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 085/155] RDMA/irdma: Add missing read barriers Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 086/155] RDMA/irdma: Fix data race on CQP completion stats Greg Kroah-Hartman
2023-08-01  9:19 ` [PATCH 5.15 087/155] RDMA/irdma: Fix data race on CQP request done Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 088/155] RDMA/mthca: Fix crash when polling CQ for shared QPs Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 089/155] RDMA/bnxt_re: Prevent handling any completions after qp destroy Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 090/155] drm/msm: Fix IS_ERR_OR_NULL() vs NULL check in a5xx_submit_in_rb() Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 091/155] ASoC: fsl_spdif: Silence output on stop Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 092/155] block: Fix a source code comment in include/uapi/linux/blkzoned.h Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 093/155] dm raid: fix missing reconfig_mutex unlock in raid_ctr() error paths Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 094/155] dm raid: clean up four equivalent goto tags in raid_ctr() Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 095/155] dm raid: protect md_stop() with reconfig_mutex Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 096/155] drm/amd: Fix an error handling mistake in psp_sw_init() Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 097/155] RDMA/irdma: Report correct WC error Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 098/155] ata: pata_ns87415: mark ns87560_tf_read static Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 099/155] ring-buffer: Fix wrong stat of cpu_buffer->read Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 100/155] tracing: Fix warning in trace_buffered_event_disable() Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 101/155] Revert "usb: gadget: tegra-xudc: Fix error check in tegra_xudc_powerdomain_init()" Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 102/155] usb: gadget: call usb_gadget_check_config() to verify UDC capability Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 103/155] USB: gadget: Fix the memory leak in raw_gadget driver Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 104/155] KVM: Grab a reference to KVM for VM and vCPU stats file descriptors Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 105/155] KVM: VMX: Dont fudge CR0 and CR4 for restricted L2 guest Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 106/155] serial: qcom-geni: drop bogus runtime pm state update Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 107/155] serial: 8250_dw: Preserve original value of DLF register Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 108/155] serial: sifive: Fix sifive_serial_console_setup() section Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 109/155] USB: serial: option: support Quectel EM060K_128 Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 110/155] USB: serial: option: add Quectel EC200A module support Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 111/155] USB: serial: simple: add Kaufmann RKS+CAN VCP Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 112/155] USB: serial: simple: sort driver entries Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 113/155] can: gs_usb: gs_can_close(): add missing set of CAN state to CAN_STATE_STOPPED Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 114/155] Revert "usb: dwc3: core: Enable AutoRetry feature in the controller" Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 115/155] usb: dwc3: pci: skip BYT GPIO lookup table for hardwired phy Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 116/155] usb: dwc3: dont reset device side if dwc3 was configured as host-only Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 117/155] usb: ohci-at91: Fix the unhandle interrupt when resume Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 118/155] USB: quirks: add quirk for Focusrite Scarlett Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 119/155] usb: cdns3: fix incorrect calculation of ep_buf_size when more than one config Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 120/155] usb: xhci-mtk: set the dma max_seg_size Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 121/155] Revert "usb: xhci: tegra: Fix error check" Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 122/155] Documentation: security-bugs.rst: update preferences when dealing with the linux-distros group Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 123/155] Documentation: security-bugs.rst: clarify CVE handling Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 124/155] staging: r8712: Fix memory leak in _r8712_init_xmit_priv() Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 125/155] staging: ks7010: potential buffer overflow in ks_wlan_set_encode_ext() Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 126/155] tty: n_gsm: fix UAF in gsm_cleanup_mux Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 127/155] Revert "xhci: add quirk for host controllers that dont update endpoint DCS" Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 128/155] ALSA: hda/relatek: Enable Mute LED on HP 250 G8 Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 129/155] hwmon: (k10temp) Enable AMD3255 Proc to show negative temperature Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 130/155] hwmon: (nct7802) Fix for temp6 (PECI1) processed even if PECI1 disabled Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 131/155] btrfs: check if the transaction was aborted at btrfs_wait_for_commit() Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 132/155] btrfs: check for commit error at btrfs_attach_transaction_barrier() Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 133/155] file: always lock position for FMODE_ATOMIC_POS Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 134/155] nfsd: Remove incorrect check in nfsd4_validate_stateid Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 135/155] tpm_tis: Explicitly check for error code Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 136/155] irq-bcm6345-l1: Do not assume a fixed block to cpu mapping Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 137/155] irqchip/gic-v4.1: Properly lock VPEs when doing a directLPI invalidation Greg Kroah-Hartman
2023-08-01  9:20 ` Greg Kroah-Hartman [this message]
2023-08-01  9:20 ` [PATCH 5.15 139/155] KVM: x86: Disallow KVM_SET_SREGS{2} if incoming CR0 is invalid Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 140/155] virtio-net: fix race between set queues and probe Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 141/155] s390/dasd: fix hanging device after quiesce/resume Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 142/155] ASoC: wm8904: Fill the cache for WM8904_ADC_TEST_0 register Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 143/155] ceph: never send metrics if disable_send_metrics is set Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 144/155] dm cache policy smq: ensure IO doesnt prevent cleaner policy progress Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 145/155] rbd: make get_lock_owner_info() return a single locker or NULL Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 146/155] rbd: harden get_lock_owner_info() a bit Greg Kroah-Hartman
2023-08-01  9:20 ` [PATCH 5.15 147/155] rbd: retrieve and check lock owner twice before blocklisting Greg Kroah-Hartman
2023-08-01  9:21 ` [PATCH 5.15 148/155] tracing: Fix trace_event_raw_event_synth() if else statement Greg Kroah-Hartman
2023-08-01  9:21 ` [PATCH 5.15 149/155] ACPI: processor: perflib: Use the "no limit" frequency QoS Greg Kroah-Hartman
2023-08-01  9:21 ` [PATCH 5.15 150/155] ACPI: processor: perflib: Avoid updating frequency QoS unnecessarily Greg Kroah-Hartman
2023-08-01  9:21 ` [PATCH 5.15 151/155] cpufreq: intel_pstate: Drop ACPI _PSS states table patching Greg Kroah-Hartman
2023-08-01  9:21 ` [PATCH 5.15 152/155] selftests: mptcp: sockopt: use iptables-legacy if available Greg Kroah-Hartman
2023-08-01  9:21 ` [PATCH 5.15 153/155] io_uring: treat -EAGAIN for REQ_F_NOWAIT as final for io-wq Greg Kroah-Hartman
2023-08-01  9:21 ` [PATCH 5.15 154/155] ASoC: cs42l51: fix driver to properly autoload with automatic module loading Greg Kroah-Hartman
2023-08-01  9:21 ` [PATCH 5.15 155/155] selftests: mptcp: join: only check for ip6tables if needed Greg Kroah-Hartman
2023-08-01 15:52 ` [PATCH 5.15 000/155] 5.15.124-rc1 review Jon Hunter
2023-08-01 16:15 ` SeongJae Park
2023-08-01 16:30 ` Florian Fainelli
2023-08-01 20:21 ` Shuah Khan
2023-08-02  1:57 ` Naresh Kamboju
2023-08-02  6:50   ` Greg Kroah-Hartman
2023-08-02  4:57 ` Harshit Mogalapalli

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=20230801091915.077461867@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=patches@lists.linux.dev \
    --cc=peterz@infradead.org \
    --cc=sashal@kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=tglx@linutronix.de \
    --cc=triangletrap12@gmail.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.