On Thu, 2015-07-09 at 12:32 -0400, Waiman Long wrote:
This patch eliminates that waiting. It also has the side effectIn any case, for such read-mostly scenarios, you'd probably want to be
of reducing the chance of writer lock stealing and improving the
fairness of the lock. Using a locking microbenchmark, a 10-threads 5M
locking loop of mostly readers (RW ratio = 10,000:1) has the following
performance numbers in a Haswell-EX box:
Kernel Locking Rate (Kops/s)
------ ---------------------
4.1.1 15,063,081
Patched 4.1.1 17,241,552
using rcu ;-).
Signed-off-by: Waiman Long<Waiman.Long@xxxxxx>^^ this
---
kernel/locking/qrwlock.c | 12 ++++--------
1 files changed, 4 insertions(+), 8 deletions(-)
diff --git a/kernel/locking/qrwlock.c b/kernel/locking/qrwlock.c
index d9c36c5..6a7a3b8 100644
--- a/kernel/locking/qrwlock.c
+++ b/kernel/locking/qrwlock.c
@@ -88,15 +88,11 @@ void queued_read_lock_slowpath(struct qrwlock *lock, u32 cnts)
arch_spin_lock(&lock->lock);
/*
- * At the head of the wait queue now, wait until the writer state
- * goes to 0 and then try to increment the reader count and get
- * the lock. It is possible that an incoming writer may steal the
- * lock in the interim, so it is necessary to check the writer byte
- * to make sure that the write lock isn't taken.
+ * At the head of the wait queue now, increment the reader count
+ * and wait until the writer, if it has the lock, has gone away.
+ * At ths
stage, it is not possible for a writer to remain in theBecause the writer setting _QW_WAITING is done in the slowpath,
+ * waiting state (_QW_WAITING). So there won't be any deadlock.
serialized with the qrwlock->lock, right?
*/Nit: since 'cnts' is now only the original value of lock->cnts before
- while (atomic_read(&lock->cnts)& _QW_WMASK)
- cpu_relax_lowlatency();
-
cnts = atomic_add_return(_QR_BIAS,&lock->cnts) - _QR_BIAS;
adding _QR_BIAS, could we rename it to 'prev_cnts' (or something)? --
iirc you removed the need for the variable when in interrupt context.