• Oleg Nesterov's avatar
    percpu_rw_semaphore: kill ->writer_mutex, add ->write_ctr · 9390ef0c
    Oleg Nesterov authored
    percpu_rw_semaphore->writer_mutex was only added to simplify the initial
    rewrite, the only thing it protects is clear_fast_ctr() which otherwise
    could be called by multiple writers.  ->rw_sem is enough to serialize the
    writers.
    
    Kill this mutex and add "atomic_t write_ctr" instead.  The writers
    increment/decrement this counter, the readers check it is zero instead of
    mutex_is_locked().
    
    Move atomic_add(clear_fast_ctr(), slow_read_ctr) under down_write() to
    avoid the race with other writers.  This is a bit sub-optimal, only the
    first writer needs this and we do not need to exclude the readers at this
    stage.  But this is simple, we do not want another internal lock until we
    add more features.
    
    And this speeds up the write-contended case.  Before this patch the racing
    writers sleep in synchronize_sched_expedited() sequentially, with this
    patch multiple synchronize_sched_expedited's can "overlap" with each
    other.  Note: we can do more optimizations, this is only the first step.
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Cc: Anton Arapov <anton@redhat.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Michal Marek <mmarek@suse.cz>
    Cc: Mikulas Patocka <mpatocka@redhat.com>
    Cc: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    9390ef0c
percpu-rwsem.c 4.47 KB