• I
    [PATCH] notifiers: fix blocking_notifier_call_chain() scalability · 1b5180b6
    Ingo Molnar 提交于
    while lock-profiling the -rt kernel i noticed weird contention during
    mmap-intense workloads, and the tracer showed the following gem, in one
    of our MM hotpaths:
    
     threaded-2771  1....   65us : sys_munmap (sysenter_do_call)
     threaded-2771  1....   66us : profile_munmap (sys_munmap)
     threaded-2771  1....   66us : blocking_notifier_call_chain (profile_munmap)
     threaded-2771  1....   66us : rt_down_read (blocking_notifier_call_chain)
    
    ouch! a global rw-semaphore taken in one of the most performance-
    sensitive codepaths of the kernel.  And i dont even have oprofile
    enabled! All distro kernels have CONFIG_PROFILING enabled, so this
    scalability problem affects the majority of Linux users.
    
    The fix is to enhance blocking_notifier_call_chain() to only take the
    lock if there appears to be work on the call-chain.
    
    With this patch applied i get nicely saturated system, and much higher
    munmap performance, on SMP systems.
    
    And as a bonus this also fixes a similar scalability bottleneck in the
    thread-exit codepath: profile_task_exit() ...
    Signed-off-by: NIngo Molnar <mingo@elte.hu>
    Acked-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
    Acked-by: NNick Piggin <nickpiggin@yahoo.com.au>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    1b5180b6
sys.c 53.5 KB