All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] locking/rwsem: Make rwsem_is_contended() track status of OSQ
@ 2017-03-07 16:03 Waiman Long
  2017-03-07 17:45 ` Peter Zijlstra
  0 siblings, 1 reply; 3+ messages in thread
From: Waiman Long @ 2017-03-07 16:03 UTC (permalink / raw)
  To: Ingo Molnar, Peter Zijlstra; +Cc: linux-kernel, Waiman Long

It was found that the current rwsem_is_contended() function did not
look at the status of the OSQ and hence would miss waiters on OSQ. So
that function is now modified to look at the OSQ as well.

Signed-off-by: Waiman Long <longman@redhat.com>
---
 include/linux/rwsem.h | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/include/linux/rwsem.h b/include/linux/rwsem.h
index dd1d142..9cb64e3 100644
--- a/include/linux/rwsem.h
+++ b/include/linux/rwsem.h
@@ -71,8 +71,18 @@ static inline int rwsem_is_locked(struct rw_semaphore *sem)
 
 #ifdef CONFIG_RWSEM_SPIN_ON_OWNER
 #define __RWSEM_OPT_INIT(lockname) , .osq = OSQ_LOCK_UNLOCKED, .owner = NULL
+
+static inline bool rwsem_osq_is_locked(struct rw_semaphore *sem)
+{
+	return osq_is_locked(&sem->osq);
+}
 #else
 #define __RWSEM_OPT_INIT(lockname)
+
+static inline bool rwsem_osq_is_locked(struct rw_semaphore *sem)
+{
+	return false;
+}
 #endif
 
 #define __RWSEM_INITIALIZER(name)				\
@@ -103,7 +113,7 @@ extern void __init_rwsem(struct rw_semaphore *sem, const char *name,
  */
 static inline int rwsem_is_contended(struct rw_semaphore *sem)
 {
-	return !list_empty(&sem->wait_list);
+	return !list_empty(&sem->wait_list) || rwsem_osq_is_locked(sem);
 }
 
 /*
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2017-03-07 20:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-07 16:03 [PATCH] locking/rwsem: Make rwsem_is_contended() track status of OSQ Waiman Long
2017-03-07 17:45 ` Peter Zijlstra
2017-03-07 18:21   ` Waiman Long

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.