perf: Optimize event scheduling locking

    Currently we only hold one ctx->lock at a time, which results in us
    flipping back and forth between cpuctx->ctx.lock and task_ctx->lock.

    Avoid this and gain large atomic regions by holding both locks. We
    nest the task lock inside the cpu lock, since with task scheduling we
    might have to change task ctx while holding the cpu ctx lock.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/r/20110409192141.769881865@chello.nl
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
perf: Remove task_ctx_sched_in()

    Make task_ctx_sched_*() imply EVENT_ALL, since anything less will not
    actually have scheduled the task in/out at all.

    Since there's no site that schedules all of a task in (due to the
    interleave with flexible cpuctx) we can remove this function.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/r/20110409192141.817893268@chello.nl
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
perf: Simplify and fix __perf_install_in_context()

    Currently __perf_install_in_context() will try and schedule in the
    event irrespective of our event scheduling rules, that is, we try to
    schedule CPU-pinned, TASK-pinned, CPU-flexible, TASK-flexible, but
    when creating a new event we simply try and schedule it on top of
    whatever is already on the PMU, this can lead to errors for pinned
    events.

    Therefore, simplify things and simply schedule everything out, add the
    event to the corresponding context and schedule everything back in.

    This also nicely handles the case where with
    __ARCH_WANT_INTERRUPTS_ON_CTXSW the IPI can come right in the middle
    of schedule, before we managed to call perf_event_task_sched_in().

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/r/20110409192141.870894224@chello.nl
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
perf: Change and simplify ctx::is_active semantics

    Instead of tracking if a context is active or not, track which events
    of the context are active. By making it a bitmask of
    EVENT_PINNED|EVENT_FLEXIBLE we can simplify some of the scheduling
    routines since it can avoid adding events that are already active.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/r/20110409192141.930282378@chello.nl
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
perf: Collect the schedule-in rules in one function

    This was scattered out - refactor it into a single function.
    No change in functionality.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/r/20110409192141.979862055@chello.nl
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
perf: Change close() semantics for group events

    In order to always call list_del_event() on the correct cpu if the
    event is part of an active context and avoid having to do two IPIs,
    change the close() semantics slightly.

    The current perf_event_disable() call would disable a whole group if
    the event that's being closed is the group leader, whereas the new
    code keeps the group siblings enabled.

    People should not rely on this behaviour and I don't think they do,
    but in case we find they do, the fix is easy and we have to take the
    double IPI cost.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Vince Weaver <vweaver1@eecs.utk.edu>
    Link: http://lkml.kernel.org/r/20110409192142.038377551@chello.nl
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
perf: De-schedule a task context when removing the last event

    Since perf_install_in_context() will now install a context when we
    add the first event, we can de-schedule the context when the last
    event is removed.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/r/20110409192142.090431763@chello.nl
    Signed-off-by: Ingo Molnar <mingo@elte.hu>