• P
    perf/core: Fix time tracking bug with multiplexing · 8fdc6539
    Peter Zijlstra 提交于
    Stephane reported that commit:
    
      3cbaa590 ("perf: Fix ctx time tracking by introducing EVENT_TIME")
    
    introduced a regression wrt. time tracking, as easily observed by:
    
    > This patch introduce a bug in the time tracking of events when
    > multiplexing is used.
    >
    > The issue is easily reproducible with the following perf run:
    >
    >  $ perf stat -a -C 0 -e branches,branches,branches,branches,branches,branches -I 1000
    >      1.000730239            652,394      branches   (66.41%)
    >      1.000730239            597,809      branches   (66.41%)
    >      1.000730239            593,870      branches   (66.63%)
    >      1.000730239            651,440      branches   (67.03%)
    >      1.000730239            656,725      branches   (66.96%)
    >      1.000730239      <not counted>      branches
    >
    > One branches event is shown as not having run. Yet, with
    > multiplexing, all events should run especially with a 1s (-I 1000)
    > interval. The delta for time_running comes out to 0. Yet, the event
    > has run because the kernel is actually multiplexing the events. The
    > problem is that the time tracking is the kernel and especially in
    > ctx_sched_out() is wrong now.
    >
    > The problem is that in case that the kernel enters ctx_sched_out() with the
    > following state:
    >    ctx->is_active=0x7 event_type=0x1
    >    Call Trace:
    >     [<ffffffff813ddd41>] dump_stack+0x63/0x82
    >     [<ffffffff81182bdc>] ctx_sched_out+0x2bc/0x2d0
    >     [<ffffffff81183896>] perf_mux_hrtimer_handler+0xf6/0x2c0
    >     [<ffffffff811837a0>] ? __perf_install_in_context+0x130/0x130
    >     [<ffffffff810f5818>] __hrtimer_run_queues+0xf8/0x2f0
    >     [<ffffffff810f6097>] hrtimer_interrupt+0xb7/0x1d0
    >     [<ffffffff810509a8>] local_apic_timer_interrupt+0x38/0x60
    >     [<ffffffff8175ca9d>] smp_apic_timer_interrupt+0x3d/0x50
    >     [<ffffffff8175ac7c>] apic_timer_interrupt+0x8c/0xa0
    >
    > In that case, the test:
    >       if (is_active & EVENT_TIME)
    >
    > will be false and the time will not be updated. Time must always be updated on
    > sched out.
    
    Fix this by always updating time if EVENT_TIME was set, as opposed to
    only updating time when EVENT_TIME changed.
    Reported-by: NStephane Eranian <eranian@google.com>
    Tested-by: NStephane Eranian <eranian@google.com>
    Signed-off-by: NPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vince Weaver <vincent.weaver@maine.edu>
    Cc: kan.liang@intel.com
    Cc: namhyung@kernel.org
    Fixes: 3cbaa590 ("perf: Fix ctx time tracking by introducing EVENT_TIME")
    Link: http://lkml.kernel.org/r/20160329072644.GB3408@twins.programming.kicks-ass.netSigned-off-by: NIngo Molnar <mingo@kernel.org>
    8fdc6539
core.c 224.4 KB