• Waiman Long's avatar
    locking/rwsem: Adaptive disabling of reader optimistic spinning · 5cfd92e1
    Waiman Long authored
    Reader optimistic spinning is helpful when the reader critical section
    is short and there aren't that many readers around. It makes readers
    relatively more preferred than writers. When a writer times out spinning
    on a reader-owned lock and set the nospinnable bits, there are two main
    reasons for that.
    
     1) The reader critical section is long, perhaps the task sleeps after
        acquiring the read lock.
     2) There are just too many readers contending the lock causing it to
        take a while to service all of them.
    
    In the former case, long reader critical section will impede the progress
    of writers which is usually more important for system performance.
    In the later case, reader optimistic spinning tends to make the reader
    groups that contain readers that acquire the lock together smaller
    leading to more of them. That may hurt performance in some cases. In
    other words, the setting of nonspinnable bits indicates that reader
    optimistic spinning may not be helpful for those workloads that cause it.
    
    Therefore, any writers that have observed the setting of the writer
    nonspinnable bit for a given rwsem after they fail to acquire the lock
    via optimistic spinning will set the reader nonspinnable bit once they
    acquire the write lock. Similarly, readers that observe the setting
    of reader nonspinnable bit at slowpath entry will also set the reader
    nonspinnable bit when they acquire the read lock via the wakeup path.
    
    Once the reader nonspinnable bit is on, it will only be reset when
    a writer is able to acquire the rwsem in the fast path or somehow a
    reader or writer in the slowpath doesn't observe the nonspinable bit.
    
    This is to discourage reader optmistic spinning on that particular
    rwsem and make writers more preferred. This adaptive disabling of reader
    optimistic spinning will alleviate some of the negative side effect of
    this feature.
    
    In addition, this patch tries to make readers in the spinning queue
    follow the phase-fair principle after quitting optimistic spinning
    by checking if another reader has somehow acquired a read lock after
    this reader enters the optimistic spinning queue. If so and the rwsem
    is still reader-owned, this reader is in the right read-phase and can
    attempt to acquire the lock.
    
    On a 2-socket 40-core 80-thread Skylake system, the page_fault1 test of
    the will-it-scale benchmark was run with various number of threads. The
    number of operations done before reader optimistic spinning patches,
    this patch and after this patch were:
    
      Threads  Before rspin  Before patch  After patch    %change
      -------  ------------  ------------  -----------    -------
        20        5541068      5345484       5455667    -3.5%/ +2.1%
        40       10185150      7292313       9219276   -28.5%/+26.4%
        60        8196733      6460517       7181209   -21.2%/+11.2%
        80        9508864      6739559       8107025   -29.1%/+20.3%
    
    This patch doesn't recover all the lost performance, but it is more
    than half. Given the fact that reader optimistic spinning does benefit
    some workloads, this is a good compromise.
    
    Using the rwsem locking microbenchmark with very short critical section,
    this patch doesn't have too much impact on locking performance as shown
    by the locking rates (kops/s) below with equal numbers of readers and
    writers before and after this patch:
    
       # of Threads  Pre-patch    Post-patch
       ------------  ---------    ----------
            2          4,730        4,969
            4          4,814        4,786
            8          4,866        4,815
           16          4,715        4,511
           32          3,338        3,500
           64          3,212        3,389
           80          3,110        3,044
    
    When running the locking microbenchmark with 40 dedicated reader and writer
    threads, however, the reader performance is curtailed to favor the writer.
    
    Before patch:
    
      40 readers, Iterations Min/Mean/Max = 204,026/234,309/254,816
      40 writers, Iterations Min/Mean/Max = 88,515/95,884/115,644
    
    After patch:
    
      40 readers, Iterations Min/Mean/Max = 33,813/35,260/36,791
      40 writers, Iterations Min/Mean/Max = 95,368/96,565/97,798
    Signed-off-by: default avatarWaiman Long <longman@redhat.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Davidlohr Bueso <dave@stgolabs.net>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Tim Chen <tim.c.chen@linux.intel.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: huang ying <huang.ying.caritas@gmail.com>
    Link: https://lkml.kernel.org/r/20190520205918.22251-16-longman@redhat.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    5cfd92e1
lock_events_list.h 3.22 KB