All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [PATCH v8 4/4] qrwlock: Use smp_store_release() in write_unlock()
@ 2014-01-13  2:47 Daniel J Blueman
  2014-01-13  3:49 ` Paul E. McKenney
  2014-01-13 16:41 ` Waiman Long
  0 siblings, 2 replies; 31+ messages in thread
From: Daniel J Blueman @ 2014-01-13  2:47 UTC (permalink / raw)
  To: Waiman Long; +Cc: Paul E. McKenney, Linux Kernel

On Thursday, 9 January 2014 01:10:03 UTC+8, Waiman Long  wrote:
 > This patch modifies the queue_write_unlock() function to use the
 > new smp_store_release() function in another pending patch. It also
 > removes the temporary implementation of smp_load_acquire() and
 > smp_store_release() function in qrwlock.c.
 >
 > This patch should only be merged if PeterZ's linux-arch patch patch
 > was merged.
 >
 > Signed-off-by: Waiman Long <Waiman.Long@hp.com>
 > Reviewed-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
 > ---
 >  include/asm-generic/qrwlock.h |    4 +---
 >  kernel/locking/qrwlock.c      |   34 ----------------------------------
 >  2 files changed, 1 insertions(+), 37 deletions(-)
 >
 > diff --git a/include/asm-generic/qrwlock.h 
b/include/asm-generic/qrwlock.h
 > index 2b9a7b4..4d4bd04 100644
 > --- a/include/asm-generic/qrwlock.h
 > +++ b/include/asm-generic/qrwlock.h
 > @@ -179,9 +179,7 @@ static inline void queue_write_unlock(struct 
qrwlock *lock)
 >  	/*
 >  	 * Make sure that none of the critical section will be leaked out.
 >  	 */
 > -	smp_mb__before_clear_bit();
 > -	ACCESS_ONCE(lock->cnts.writer) = 0;
 > -	smp_mb__after_clear_bit();
 > +	smp_store_release(&lock->cnts.writer, 0)

This will fail compilation, so probably needs further testing with 
Peter's load_acquire/store_release barrier patches.

Thanks,
   Daniel
-- 
Daniel J Blueman
Principal Software Engineer, Numascale

^ permalink raw reply	[flat|nested] 31+ messages in thread
* [PATCH v8 0/4] qrwlock: Introducing a queue read/write lock implementation
@ 2014-01-08 16:59 Waiman Long
  2014-01-08 16:59 ` [PATCH v8 4/4] qrwlock: Use smp_store_release() in write_unlock() Waiman Long
  0 siblings, 1 reply; 31+ messages in thread
From: Waiman Long @ 2014-01-08 16:59 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Arnd Bergmann
  Cc: linux-arch, x86, linux-kernel, Peter Zijlstra, Steven Rostedt,
	Andrew Morton, Michel Lespinasse, Andi Kleen, Rik van Riel,
	Paul E. McKenney, Linus Torvalds, Raghavendra K T, George Spelvin,
	Tim Chen, Aswin Chandramouleeswaran", Scott J Norton,
	Waiman Long

v7->v8:
 - Use atomic_t functions (which are implemented in all arch's) to
   modify reader counts.
 - Use smp_load_acquire() & smp_store_release() for barriers.
 - Further tuning in slowpath performance.

v6->v7:
 - Remove support for unfair lock, so only fair qrwlock will be provided.
 - Move qrwlock.c to the kernel/locking directory.

v5->v6:
 - Modify queue_read_can_lock() to avoid false positive result.
 - Move the two slowpath functions' performance tuning change from
   patch 4 to patch 1.
 - Add a new optional patch to use the new smp_store_release() function 
   if that is merged.

v4->v5:
 - Fix wrong definitions for QW_MASK_FAIR & QW_MASK_UNFAIR macros.
 - Add an optional patch 4 which should only be applied after the
   mcs_spinlock.h header file is merged.

v3->v4:
 - Optimize the fast path with better cold cache behavior and
   performance.
 - Removing some testing code.
 - Make x86 use queue rwlock with no user configuration.

v2->v3:
 - Make read lock stealing the default and fair rwlock an option with
   a different initializer.
 - In queue_read_lock_slowpath(), check irq_count() and force spinning
   and lock stealing in interrupt context.
 - Unify the fair and classic read-side code path, and make write-side
   to use cmpxchg with 2 different writer states. This slows down the
   write lock fastpath to make the read side more efficient, but is
   still slightly faster than a spinlock.

v1->v2:
 - Improve lock fastpath performance.
 - Optionally provide classic read/write lock behavior for backward
   compatibility.
 - Use xadd instead of cmpxchg for fair reader code path to make it
   immute to reader contention.
 - Run more performance testing.

As mentioned in the LWN article http://lwn.net/Articles/364583/,
the read/write lock suffer from an unfairness problem that it is
possible for a stream of incoming readers to block a waiting writer
from getting the lock for a long time. Also, a waiting reader/writer
contending a rwlock in local memory will have a higher chance of
acquiring the lock than a reader/writer in remote node.

This patch set introduces a queue-based read/write lock implementation
that can largely solve this unfairness problem.

The read lock slowpath will check if the reader is in an interrupt
context. If so, it will force lock spinning and stealing without
waiting in a queue. This is to ensure the read lock will be granted
as soon as possible.

The queue write lock can also be used as a replacement for ticket
spinlocks that are highly contended if lock size increase is not
an issue.

This patch set currently provides queue read/write lock support on
x86 architecture only. Support for other architectures can be added
later on once architecture specific support infrastructure is added
and proper testing is done.

The optional patch 3 has a dependency on the the mcs_spinlock.h
header file which has not been merged yet. So this patch should only
be applied after the mcs_spinlock.h header file is merged.

The optional patch 4 use the new smp_store_release() and
smp_load_acquire() functions which are being reviewed & not merged yet.

Waiman Long (4):
  qrwlock: A queue read/write lock implementation
  qrwlock x86: Enable x86 to use queue read/write lock
  qrwlock: Use the mcs_spinlock helper functions for MCS queuing
  qrwlock: Use smp_store_release() in write_unlock()

 arch/x86/Kconfig                      |    1 +
 arch/x86/include/asm/spinlock.h       |    2 +
 arch/x86/include/asm/spinlock_types.h |    4 +
 include/asm-generic/qrwlock.h         |  203 +++++++++++++++++++++++++++++++++
 kernel/Kconfig.locks                  |    7 +
 kernel/locking/Makefile               |    1 +
 kernel/locking/qrwlock.c              |  191 +++++++++++++++++++++++++++++++
 7 files changed, 409 insertions(+), 0 deletions(-)
 create mode 100644 include/asm-generic/qrwlock.h
 create mode 100644 kernel/locking/qrwlock.c

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

end of thread, other threads:[~2014-01-21 16:16 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-13  2:47 [PATCH v8 4/4] qrwlock: Use smp_store_release() in write_unlock() Daniel J Blueman
2014-01-13  3:49 ` Paul E. McKenney
2014-01-13 16:41 ` Waiman Long
2014-01-14  2:28   ` Daniel J Blueman
2014-01-14 11:03     ` Peter Zijlstra
2014-01-14 15:25       ` Waiman Long
2014-01-14 17:08       ` Matt Turner
2014-01-14 18:01         ` Richard Henderson
2014-01-14 19:09           ` Waiman Long
2014-01-14 20:20             ` Peter Zijlstra
2014-01-14 23:44           ` Paul E. McKenney
2014-01-15  0:25             ` Linus Torvalds
2014-01-15  2:39               ` Paul E. McKenney
2014-01-15  8:07                 ` Peter Zijlstra
2014-01-15 20:53                   ` Paul E. McKenney
2014-01-15 23:21                     ` Peter Zijlstra
     [not found]                       ` <CA+55aFydYLQeBq=4AQQp_4dAnq09ocLmde1LFaXiNAJ=wJzfFA@mail.gmail.com>
2014-01-16 10:36                         ` Peter Zijlstra
2014-01-18 10:01                           ` Paul E. McKenney
2014-01-18 11:34                             ` Peter Zijlstra
2014-01-18 12:25                               ` Paul E. McKenney
2014-01-18 12:41                                 ` Peter Zijlstra
2014-01-18 21:22                                   ` Paul E. McKenney
2014-01-19  0:57                                     ` Linus Torvalds
2014-01-19  8:04                                       ` Paul E. McKenney
2014-01-19 19:56                                         ` Linus Torvalds
2014-01-20  0:52                                           ` Paul E. McKenney
2014-01-21 15:02                                         ` Waiman Long
2014-01-21 15:41                                           ` Peter Zijlstra
2014-01-21 16:16                                             ` Waiman Long
2014-01-15  3:08             ` Daniel J Blueman
  -- strict thread matches above, loose matches on Subject: below --
2014-01-08 16:59 [PATCH v8 0/4] qrwlock: Introducing a queue read/write lock implementation Waiman Long
2014-01-08 16:59 ` [PATCH v8 4/4] qrwlock: Use smp_store_release() in write_unlock() 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.