All of lore.kernel.org
 help / color / mirror / Atom feed
From: Shaoying Xu <shaoyi@amazon.com>
To: <stable@vger.kernel.org>
Cc: <abuehaze@amazon.com>, <peterz@infradead.org>,
	<longman@redhat.com>, Davidlohr Bueso <dbueso@suse.de>,
	Shaoying Xu <shaoyi@amazon.com>
Subject: [PATCH stable 5.10 4/7] locking/rwsem: Pass the current atomic count to rwsem_down_read_slowpath()
Date: Tue, 7 Feb 2023 19:01:32 +0000	[thread overview]
Message-ID: <20230207190135.25258-5-shaoyi@amazon.com> (raw)
In-Reply-To: <20230207190135.25258-1-shaoyi@amazon.com>

From: Waiman Long <longman@redhat.com>

commit c8fe8b0564388f41147326f31e4587171aacccd4 upstream

The atomic count value right after reader count increment can be useful
to determine the rwsem state at trylock time. So the count value is
passed down to rwsem_down_read_slowpath() to be used when appropriate.

Signed-off-by: Waiman Long <longman@redhat.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Davidlohr Bueso <dbueso@suse.de>
Link: https://lkml.kernel.org/r/20201121041416.12285-2-longman@redhat.com
Cc: <stable@vger.kernel.org> # 5.10
Signed-off-by: Shaoying Xu <shaoyi@amazon.com>
---
 kernel/locking/rwsem.c | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c
index 46f308a01045..94d0fa715214 100644
--- a/kernel/locking/rwsem.c
+++ b/kernel/locking/rwsem.c
@@ -270,14 +270,14 @@ static inline void rwsem_set_nonspinnable(struct rw_semaphore *sem)
 					  owner | RWSEM_NONSPINNABLE));
 }
 
-static inline bool rwsem_read_trylock(struct rw_semaphore *sem)
+static inline bool rwsem_read_trylock(struct rw_semaphore *sem, long *cntp)
 {
-	long cnt = atomic_long_add_return_acquire(RWSEM_READER_BIAS, &sem->count);
+	*cntp = atomic_long_add_return_acquire(RWSEM_READER_BIAS, &sem->count);
 
-	if (WARN_ON_ONCE(cnt < 0))
+	if (WARN_ON_ONCE(*cntp < 0))
 		rwsem_set_nonspinnable(sem);
 
-	if (!(cnt & RWSEM_READ_FAILED_MASK)) {
+	if (!(*cntp & RWSEM_READ_FAILED_MASK)) {
 		rwsem_set_reader_owned(sem);
 		return true;
 	}
@@ -1008,9 +1008,9 @@ rwsem_spin_on_owner(struct rw_semaphore *sem, unsigned long nonspinnable)
  * Wait for the read lock to be granted
  */
 static struct rw_semaphore __sched *
-rwsem_down_read_slowpath(struct rw_semaphore *sem, int state)
+rwsem_down_read_slowpath(struct rw_semaphore *sem, long count, int state)
 {
-	long count, adjustment = -RWSEM_READER_BIAS;
+	long adjustment = -RWSEM_READER_BIAS;
 	struct rwsem_waiter waiter;
 	DEFINE_WAKE_Q(wake_q);
 	bool wake = false;
@@ -1356,8 +1356,10 @@ static struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem)
  */
 static inline int __down_read_common(struct rw_semaphore *sem, int state)
 {
-	if (!rwsem_read_trylock(sem)) {
-		if (IS_ERR(rwsem_down_read_slowpath(sem, state)))
+	long count;
+
+	if (!rwsem_read_trylock(sem, &count)) {
+		if (IS_ERR(rwsem_down_read_slowpath(sem, count, state)))
 			return -EINTR;
 		DEBUG_RWSEMS_WARN_ON(!is_rwsem_reader_owned(sem), sem);
 	}
-- 
2.38.1


  parent reply	other threads:[~2023-02-07 19:02 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-07 19:01 [PATCH stable 5.10 0/7] Remove reader optimistic spinning Shaoying Xu
2023-02-07 19:01 ` [PATCH stable 5.10 1/7] locking/rwsem: Better collate rwsem_read_trylock() Shaoying Xu
2023-02-07 19:01 ` [PATCH stable 5.10 2/7] locking/rwsem: Introduce rwsem_write_trylock() Shaoying Xu
2023-02-07 19:01 ` [PATCH stable 5.10 3/7] locking/rwsem: Fold __down_{read,write}*() Shaoying Xu
2023-02-07 19:01 ` Shaoying Xu [this message]
2023-02-07 19:09 ` [PATCH stable 5.10 5/7] locking/rwsem: Prevent potential lock starvation Shaoying Xu
2023-02-07 19:09   ` [PATCH stable 5.10 6/7] locking/rwsem: Enable reader optimistic lock stealing Shaoying Xu
2023-02-07 19:09   ` [PATCH stable 5.10 7/7] locking/rwsem: Remove reader optimistic spinning Shaoying Xu
2023-02-09 10:36 ` [PATCH stable 5.10 0/7] " Greg KH
2023-02-13 12:11   ` Mohamed Abuelfotoh, Hazem
2023-02-17 14:03     ` Greg KH

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=20230207190135.25258-5-shaoyi@amazon.com \
    --to=shaoyi@amazon.com \
    --cc=abuehaze@amazon.com \
    --cc=dbueso@suse.de \
    --cc=longman@redhat.com \
    --cc=peterz@infradead.org \
    --cc=stable@vger.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 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.