• Peter Zijlstra's avatar
    perf: Fix task context scheduling · 39a43640
    Peter Zijlstra authored
    There is a very nasty problem wrt disabling the perf task scheduling
    hooks.
    
    Currently we {set,clear} ctx->is_active on every
    __perf_event_task_sched_{in,out}, _however_ this means that if we
    disable these calls we'll have task contexts with ->is_active set that
    are not active and 'active' task contexts without ->is_active set.
    
    This can result in event_function_call() looping on the ctx->is_active
    condition basically indefinitely.
    
    Resolve this by changing things such that contexts without events do
    not set ->is_active like we used to. From this invariant it trivially
    follows that if there are no (task) events, every task ctx is inactive
    and disabling the context switch hooks is harmless.
    
    This leaves two places that need attention (and already had
    accumulated weird and wonderful hacks to work around, without
    recognising this actual problem).
    
    Namely:
    
     - perf_install_in_context() will need to deal with installing events
       in an inactive context, meaning it cannot rely on ctx-is_active for
       its IPIs.
    
     - perf_remove_from_context() will have to mark a context as inactive
       when it removes the last event.
    
    For specific detail, see the patch/comments.
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Dmitry Vyukov <dvyukov@google.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Vince Weaver <vincent.weaver@maine.edu>
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    39a43640
core.c 220 KB