• Stephane Eranian's avatar
    perf_events: Fix time tracking in samples · eed01528
    Stephane Eranian authored
    This patch corrects time tracking in samples. Without this patch
    both time_enabled and time_running are bogus when user asks for
    PERF_SAMPLE_READ.
    
    One uses PERF_SAMPLE_READ to sample the values of other counters
    in each sample. Because of multiplexing, it is necessary to know
    both time_enabled, time_running to be able to scale counts correctly.
    
    In this second version of the patch, we maintain a shadow
    copy of ctx->time which allows us to compute ctx->time without
    calling update_context_time() from NMI context. We avoid the
    issue that update_context_time() must always be called with
    ctx->lock held.
    
    We do not keep shadow copies of the other event timings
    because if the lead event is overflowing then it is active
    and thus it's been scheduled in via event_sched_in() in
    which case neither tstamp_stopped, tstamp_running can be modified.
    
    This timing logic only applies to samples when PERF_SAMPLE_READ
    is used.
    
    Note that this patch does not address timing issues related
    to sampling inheritance between tasks. This will be addressed
    in a future patch.
    
    With this patch, the libpfm4 example task_smpl now reports
    correct counts (shown on 2.4GHz Core 2):
    
    $ task_smpl -p 2400000000 -e unhalted_core_cycles:u,instructions_retired:u,baclears  noploop 5
    noploop for 5 seconds
    IIP:0x000000004006d6 PID:5596 TID:5596 TIME:466,210,211,430 STREAM_ID:33 PERIOD:2,400,000,000 ENA=1,010,157,814 RUN=1,010,157,814 NR=3
    	2,400,000,254 unhalted_core_cycles:u (33)
    	2,399,273,744 instructions_retired:u (34)
    	53,340 baclears (35)
    Signed-off-by: default avatarStephane Eranian <eranian@google.com>
    Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
    LKML-Reference: <4cc6e14b.1e07e30a.256e.5190@mx.google.com>
    Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
    eed01528
perf_event.c 143 KB