Jiri Wiesner e0ba10
From 92cc5d00a431e96e5a49c0b97e5ad4fa7536bd4b Mon Sep 17 00:00:00 2001
Jiri Wiesner e0ba10
From: John Stultz <jstultz@google.com>
Jiri Wiesner e0ba10
Date: Wed, 3 May 2023 02:33:51 +0000
Jiri Wiesner e0ba10
Subject: [PATCH] locking/rwsem: Add __always_inline annotation to
Jiri Wiesner e0ba10
 __down_read_common() and inlined callers
Jiri Wiesner e0ba10
Git-commit: 92cc5d00a431e96e5a49c0b97e5ad4fa7536bd4b
Jiri Wiesner e0ba10
Patch-mainline: v6.4-rc2
Jiri Wiesner e0ba10
References: git-fixes
Jiri Wiesner e0ba10
Jiri Wiesner e0ba10
Apparently despite it being marked inline, the compiler
Jiri Wiesner e0ba10
may not inline __down_read_common() which makes it difficult
Jiri Wiesner e0ba10
to identify the cause of lock contention, as the blocked
Jiri Wiesner e0ba10
function in traceevents will always be listed as
Jiri Wiesner e0ba10
__down_read_common().
Jiri Wiesner e0ba10
Jiri Wiesner e0ba10
So this patch adds __always_inline annotation to the common
Jiri Wiesner e0ba10
function (as well as the inlined helper callers) to force it to
Jiri Wiesner e0ba10
be inlined so the blocking function will be listed (via Wchan)
Jiri Wiesner e0ba10
in traceevents.
Jiri Wiesner e0ba10
Jiri Wiesner e0ba10
Fixes: c995e638ccbb ("locking/rwsem: Fold __down_{read,write}*()")
Jiri Wiesner e0ba10
Reported-by: Tim Murray <timmurray@google.com>
Jiri Wiesner e0ba10
Signed-off-by: John Stultz <jstultz@google.com>
Jiri Wiesner e0ba10
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Jiri Wiesner e0ba10
Reviewed-by: Waiman Long <longman@redhat.com>
Jiri Wiesner e0ba10
Cc: stable@vger.kernel.org
Jiri Wiesner e0ba10
Link: https://lkml.kernel.org/r/20230503023351.2832796-1-jstultz@google.com
Jiri Wiesner e0ba10
Signed-off-by: Jiri Wiesner <jwiesner@suse.de>
Jiri Wiesner e0ba10
---
Jiri Wiesner e0ba10
 kernel/locking/rwsem.c | 8 ++++----
Jiri Wiesner e0ba10
 1 file changed, 4 insertions(+), 4 deletions(-)
Jiri Wiesner e0ba10
Jiri Wiesner e0ba10
diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c
Jiri Wiesner e0ba10
index acb5a50309a1..9eabd585ce7a 100644
Jiri Wiesner e0ba10
--- a/kernel/locking/rwsem.c
Jiri Wiesner e0ba10
+++ b/kernel/locking/rwsem.c
Jiri Wiesner e0ba10
@@ -1240,7 +1240,7 @@ static struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem)
Jiri Wiesner e0ba10
 /*
Jiri Wiesner e0ba10
  * lock for reading
Jiri Wiesner e0ba10
  */
Jiri Wiesner e0ba10
-static inline int __down_read_common(struct rw_semaphore *sem, int state)
Jiri Wiesner e0ba10
+static __always_inline int __down_read_common(struct rw_semaphore *sem, int state)
Jiri Wiesner e0ba10
 {
Jiri Wiesner e0ba10
 	int ret = 0;
Jiri Wiesner e0ba10
 	long count;
Jiri Wiesner e0ba10
@@ -1258,17 +1258,17 @@ static inline int __down_read_common(struct rw_semaphore *sem, int state)
Jiri Wiesner e0ba10
 	return ret;
Jiri Wiesner e0ba10
 }
Jiri Wiesner e0ba10
 
Jiri Wiesner e0ba10
-static inline void __down_read(struct rw_semaphore *sem)
Jiri Wiesner e0ba10
+static __always_inline void __down_read(struct rw_semaphore *sem)
Jiri Wiesner e0ba10
 {
Jiri Wiesner e0ba10
 	__down_read_common(sem, TASK_UNINTERRUPTIBLE);
Jiri Wiesner e0ba10
 }
Jiri Wiesner e0ba10
 
Jiri Wiesner e0ba10
-static inline int __down_read_interruptible(struct rw_semaphore *sem)
Jiri Wiesner e0ba10
+static __always_inline int __down_read_interruptible(struct rw_semaphore *sem)
Jiri Wiesner e0ba10
 {
Jiri Wiesner e0ba10
 	return __down_read_common(sem, TASK_INTERRUPTIBLE);
Jiri Wiesner e0ba10
 }
Jiri Wiesner e0ba10
 
Jiri Wiesner e0ba10
-static inline int __down_read_killable(struct rw_semaphore *sem)
Jiri Wiesner e0ba10
+static __always_inline int __down_read_killable(struct rw_semaphore *sem)
Jiri Wiesner e0ba10
 {
Jiri Wiesner e0ba10
 	return __down_read_common(sem, TASK_KILLABLE);
Jiri Wiesner e0ba10
 }
Jiri Wiesner e0ba10
-- 
Jiri Wiesner e0ba10
2.35.3
Jiri Wiesner e0ba10