• Peter Zijlstra's avatar
    perf_event: Optimize perf_output_lock() · 559fdc3c
    Peter Zijlstra authored
    The purpose of perf_output_{un,}lock() is to:
    
     1) avoid publishing incomplete data
        [ possible when publishing a head that is ahead of an entry
          that is still being written ]
    
     2) guarantee fwd progress
        [ a simple refcount on pending writers doesn't need to drop to
          0, making it so would end up implementing something like forced
          quiecent states of RCU ]
    
    To satisfy the above without undue complexity it serializes
    between CPUs, this means that a pending writer can only be the
    same cpu in a nested context, and since (under normal operation)
    a cpu always makes progress we're good -- if the head is only
    published when the bottom  most writer completes.
    
    Now we don't need to disable IRQs in order to serialize between
    CPUs, disabling preemption ought to be sufficient, esp since we
    already deal with nesting due to NMIs.
    
    This avoids potentially expensive (and needless) local IRQ
    disable/enable ops.
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    LKML-Reference: <1258373161.26714.254.camel@laptop>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    559fdc3c
perf_event.c 118 KB