Skip to content
  • Peter Zijlstra's avatar
    perf: Fix race between event install and jump_labels · 9107c89e
    Peter Zijlstra authored and Ingo Molnar's avatar Ingo Molnar committed
    
    
    perf_install_in_context() relies upon the context switch hooks to have
    scheduled in events when the IPI misses its target -- after all, if
    the task has moved from the CPU (or wasn't running at all), it will
    have to context switch to run elsewhere.
    
    This however doesn't appear to be happening.
    
    It is possible for the IPI to not happen (task wasn't running) only to
    later observe the task running with an inactive context.
    
    The only possible explanation is that the context switch hooks are not
    called. Therefore put in a sync_sched() after toggling the jump_label
    to guarantee all CPUs will have them enabled before we install an
    event.
    
    A simple if (0->1) sync_sched() will not in fact work, because any
    further increment can race and complete before the sync_sched().
    Therefore we must jump through some hoops.
    
    Signed-off-by: default avatarPeter 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: dvyukov@google.com
    Cc: eranian@google.com
    Cc: oleg@redhat.com
    Cc: panand@redhat.com
    Cc: sasha.levin@oracle.com
    Cc: vince@deater.net
    Link: http://lkml.kernel.org/r/20160224174947.980211985@infradead.org
    
    
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    9107c89e