• Davidlohr Bueso's avatar
    locking/rwsem: Enable lockless waiter wakeup(s) · 133e89ef
    Davidlohr Bueso authored
    As wake_qs gain users, we can teach rwsems about them such that
    waiters can be awoken without the wait_lock. This is for both
    readers and writer, the former being the most ideal candidate
    as we can batch the wakeups shortening the critical region that
    much more -- ie writer task blocking a bunch of tasks waiting to
    service page-faults (mmap_sem readers).
    
    In general applying wake_qs to rwsem (xadd) is not difficult as
    the wait_lock is intended to be released soon _anyways_, with
    the exception of when a writer slowpath will proactively wakeup
    any queued readers if it sees that the lock is owned by a reader,
    in which we simply do the wakeups with the lock held (see comment
    in __rwsem_down_write_failed_common()).
    
    Similar to other locking primitives, delaying the waiter being
    awoken does allow, at least in theory, the lock to be stolen in
    the case of writers, however no harm was seen in this (in fact
    lock stealing tends to be a _good_ thing in most workloads), and
    this is a tiny window anyways.
    
    Some page-fault (pft) and mmap_sem intensive benchmarks show some
    pretty constant reduction in systime (by up to ~8 and ~10%) on a
    2-socket, 12 core AMD box. In addition, on an 8-core Westmere doing
    page allocations (page_test)
    
    aim9:
    	 4.6-rc6				4.6-rc6
    						rwsemv2
    Min      page_test   378167.89 (  0.00%)   382613.33 (  1.18%)
    Min      exec_test      499.00 (  0.00%)      502.67 (  0.74%)
    Min      fork_test     3395.47 (  0.00%)     3537.64 (  4.19%)
    Hmean    page_test   395433.06 (  0.00%)   414693.68 (  4.87%)
    Hmean    exec_test      499.67 (  0.00%)      505.30 (  1.13%)
    Hmean    fork_test     3504.22 (  0.00%)     3594.95 (  2.59%)
    Stddev   page_test    17426.57 (  0.00%)    26649.92 (-52.93%)
    Stddev   exec_test        0.47 (  0.00%)        1.41 (-199.05%)
    Stddev   fork_test       63.74 (  0.00%)       32.59 ( 48.86%)
    Max      page_test   429873.33 (  0.00%)   456960.00 (  6.30%)
    Max      exec_test      500.33 (  0.00%)      507.66 (  1.47%)
    Max      fork_test     3653.33 (  0.00%)     3650.90 ( -0.07%)
    
    	     4.6-rc6     4.6-rc6
    			 rwsemv2
    User            1.12        0.04
    System          0.23        0.04
    Elapsed       727.27      721.98
    Signed-off-by: default avatarDavidlohr Bueso <dbueso@suse.de>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Waiman.Long@hpe.com
    Cc: dave@stgolabs.net
    Cc: jason.low2@hp.com
    Cc: peter@hurleysoftware.com
    Link: http://lkml.kernel.org/r/1463165787-25937-2-git-send-email-dave@stgolabs.netSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    133e89ef
rwsem-xadd.c 17.3 KB