Patch "locking/rwsem: Add __always_inline annotation to __down_write_common() and inlined callers" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    locking/rwsem: Add __always_inline annotation to __down_write_common() and inlined callers

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     locking-rwsem-add-__always_inline-annotation-to-__do.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 3cf11f7aab3174622614ae4ea87bc93bf42a298c
Author: John Stultz <jstultz@xxxxxxxxxx>
Date:   Mon Jul 8 23:08:27 2024 -0700

    locking/rwsem: Add __always_inline annotation to __down_write_common() and inlined callers
    
    [ Upstream commit e81859fe64ad42dccefe134d1696e0635f78d763 ]
    
    Apparently despite it being marked inline, the compiler
    may not inline __down_write_common() which makes it difficult
    to identify the cause of lock contention, as the wchan of the
    blocked function will always be listed as __down_write_common().
    
    So add __always_inline annotation to the common function (as
    well as the inlined helper callers) to force it to be inlined
    so a more useful blocking function will be listed (via wchan).
    
    This mirrors commit 92cc5d00a431 ("locking/rwsem: Add
    __always_inline annotation to __down_read_common() and inlined
    callers") which did the same for __down_read_common.
    
    I sort of worry that I'm playing wack-a-mole here, and talking
    with compiler people, they tell me inline means nothing, which
    makes me want to cry a little. So I'm wondering if we need to
    replace all the inlines with __always_inline, or remove them
    because either we mean something by it, or not.
    
    Fixes: c995e638ccbb ("locking/rwsem: Fold __down_{read,write}*()")
    Reported-by: Tim Murray <timmurray@xxxxxxxxxx>
    Signed-off-by: John Stultz <jstultz@xxxxxxxxxx>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
    Acked-by: Waiman Long <longman@xxxxxxxxxx>
    Link: https://lkml.kernel.org/r/20240709060831.495366-1-jstultz@xxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c
index 4a38d32b89fa3..eca42c14ec09a 100644
--- a/kernel/locking/rwsem.c
+++ b/kernel/locking/rwsem.c
@@ -1286,7 +1286,7 @@ static inline int __down_read_trylock(struct rw_semaphore *sem)
 /*
  * lock for writing
  */
-static inline int __down_write_common(struct rw_semaphore *sem, int state)
+static __always_inline int __down_write_common(struct rw_semaphore *sem, int state)
 {
 	if (unlikely(!rwsem_write_trylock(sem))) {
 		if (IS_ERR(rwsem_down_write_slowpath(sem, state)))
@@ -1296,12 +1296,12 @@ static inline int __down_write_common(struct rw_semaphore *sem, int state)
 	return 0;
 }
 
-static inline void __down_write(struct rw_semaphore *sem)
+static __always_inline void __down_write(struct rw_semaphore *sem)
 {
 	__down_write_common(sem, TASK_UNINTERRUPTIBLE);
 }
 
-static inline int __down_write_killable(struct rw_semaphore *sem)
+static __always_inline int __down_write_killable(struct rw_semaphore *sem)
 {
 	return __down_write_common(sem, TASK_KILLABLE);
 }




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux