• Waiman Long's avatar
    signals: avoid unnecessary taking of sighand->siglock · c7be96af
    Waiman Long authored
    When running certain database workload on a high-end system with many
    CPUs, it was found that spinlock contention in the sigprocmask syscalls
    became a significant portion of the overall CPU cycles as shown below.
    
      9.30%  9.30%  905387  dataserver  /proc/kcore 0x7fff8163f4d2
      [k] _raw_spin_lock_irq
                |
                ---_raw_spin_lock_irq
                   |
                   |--99.34%-- __set_current_blocked
                   |          sigprocmask
                   |          sys_rt_sigprocmask
                   |          system_call_fastpath
                   |          |
                   |          |--50.63%-- __swapcontext
                   |          |          |
                   |          |          |--99.91%-- upsleepgeneric
                   |          |
                   |          |--49.36%-- __setcontext
                   |          |          ktskRun
    
    Looking further into the swapcontext function in glibc, it was found that
    the function always call sigprocmask() without checking if there are
    changes in the signal mask.
    
    A check was added to the __set_current_blocked() function to avoid taking
    the sighand->siglock spinlock if there is no change in the signal mask.
    This will prevent unneeded spinlock contention when many threads are
    trying to call sigprocmask().
    
    With this patch applied, the spinlock contention in sigprocmask() was
    gone.
    
    Link: http://lkml.kernel.org/r/1474979209-11867-1-git-send-email-Waiman.Long@hpe.comSigned-off-by: default avatarWaiman Long <Waiman.Long@hpe.com>
    Acked-by: default avatarOleg Nesterov <oleg@redhat.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Stas Sergeev <stsp@list.ru>
    Cc: Scott J Norton <scott.norton@hpe.com>
    Cc: Douglas Hatch <doug.hatch@hpe.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    c7be96af
signal.c 94.5 KB