Skip to content
  • Waiman Long's avatar
    proc: change proc_subdir_lock to a rwlock · ecf1a3df
    Waiman Long authored
    
    
    The proc_subdir_lock spinlock is used to allow only one task to make
    change to the proc directory structure as well as looking up information
    in it.  However, the information lookup part can actually be entered by
    more than one task as the pde_get() and pde_put() reference count update
    calls in the critical sections are atomic increment and decrement
    respectively and so are safe with concurrent updates.
    
    The x86 architecture has already used qrwlock which is fair and other
    architectures like ARM are in the process of switching to qrwlock.  So
    unfairness shouldn't be a concern in that conversion.
    
    This patch changed the proc_subdir_lock to a rwlock in order to enable
    concurrent lookup. The following functions were modified to take a
    write lock:
     - proc_register()
     - remove_proc_entry()
     - remove_proc_subtree()
    
    The following functions were modified to take a read lock:
     - xlate_proc_name()
     - proc_lookup_de()
     - proc_readdir_de()
    
    A parallel /proc filesystem search with the "find" command (1000 threads)
    was run on a 4-socket Haswell-EX box (144 threads).  Before the patch, the
    parallel search took about 39s.  After the patch, the parallel find took
    only 25s, a saving of about 14s.
    
    The micro-benchmark that I used was artificial, but it was used to
    reproduce an exit hanging problem that I saw in real application.  In
    fact, only allow one task to do a lookup seems too limiting to me.
    
    Signed-off-by: default avatarWaiman Long <Waiman.Long@hp.com>
    Acked-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
    Cc: Alexey Dobriyan <adobriyan@gmail.com>
    Cc: Nicolas Dichtel <nicolas.dichtel@6wind.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Scott J Norton <scott.norton@hp.com>
    Cc: Douglas Hatch <doug.hatch@hp.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ecf1a3df