From fd0a24bf129fbe810cf40a0f65f22dd7c20e7cec Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 5 Aug 2013 17:40:47 +0800 Subject: [PATCH] 3.0-stable patches added patches: perf-fix-event-group-context-move.patch --- .../perf-fix-event-group-context-move.patch | 90 +++++++++++++++++++ queue-3.0/series | 1 + 2 files changed, 91 insertions(+) create mode 100644 queue-3.0/perf-fix-event-group-context-move.patch diff --git a/queue-3.0/perf-fix-event-group-context-move.patch b/queue-3.0/perf-fix-event-group-context-move.patch new file mode 100644 index 00000000000..057a3be3b1e --- /dev/null +++ b/queue-3.0/perf-fix-event-group-context-move.patch @@ -0,0 +1,90 @@ +From 0231bb5336758426b44ccd798ccd3c5419c95d58 Mon Sep 17 00:00:00 2001 +From: Jiri Olsa +Date: Fri, 1 Feb 2013 11:23:45 +0100 +Subject: perf: Fix event group context move + +From: Jiri Olsa + +commit 0231bb5336758426b44ccd798ccd3c5419c95d58 upstream. + +When we have group with mixed events (hw/sw) we want to end up +with group leader being in hw context. So if group leader is +initialy sw event, we move all the events under hw context. + +The move is done for each event by removing it from its context +and adding it back into proper one. As a part of the removal the +event is automatically disabled, which is not what we want at +this stage of creating groups. + +The fix is to initialize event state after removal from sw +context. + +This fix resulted from the following discussion: + + http://thread.gmane.org/gmane.linux.kernel.perf.user/1144 + +Reported-by: Andreas Hollmann +Signed-off-by: Jiri Olsa +Cc: Arnaldo Carvalho de Melo +Cc: Namhyung Kim +Cc: Corey Ashford +Cc: Frederic Weisbecker +Cc: Paul Mackerras +Cc: Peter Zijlstra +Cc: Stephane Eranian +Cc: Vince Weaver +Link: http://lkml.kernel.org/r/1359714225-4231-1-git-send-email-jolsa@redhat.com +Signed-off-by: Ingo Molnar +Cc: Li Zefan +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/events/core.c | 20 ++++++++++++++++++-- + 1 file changed, 18 insertions(+), 2 deletions(-) + +--- a/kernel/events/core.c ++++ b/kernel/events/core.c +@@ -839,6 +839,15 @@ list_add_event(struct perf_event *event, + } + + /* ++ * Initialize event state based on the perf_event_attr::disabled. ++ */ ++static inline void perf_event__state_init(struct perf_event *event) ++{ ++ event->state = event->attr.disabled ? PERF_EVENT_STATE_OFF : ++ PERF_EVENT_STATE_INACTIVE; ++} ++ ++/* + * Called at perf_event creation and when events are attached/detached from a + * group. + */ +@@ -6241,8 +6250,7 @@ perf_event_alloc(struct perf_event_attr + + event->overflow_handler = overflow_handler; + +- if (attr->disabled) +- event->state = PERF_EVENT_STATE_OFF; ++ perf_event__state_init(event); + + pmu = NULL; + +@@ -6616,9 +6624,17 @@ SYSCALL_DEFINE5(perf_event_open, + + mutex_lock(&gctx->mutex); + perf_remove_from_context(group_leader); ++ ++ /* ++ * Removing from the context ends up with disabled ++ * event. What we want here is event in the initial ++ * startup state, ready to be add into new context. ++ */ ++ perf_event__state_init(group_leader); + list_for_each_entry(sibling, &group_leader->sibling_list, + group_entry) { + perf_remove_from_context(sibling); ++ perf_event__state_init(sibling); + put_ctx(gctx); + } + mutex_unlock(&gctx->mutex); diff --git a/queue-3.0/series b/queue-3.0/series index 7d65b5a6668..458bdcc5b33 100644 --- a/queue-3.0/series +++ b/queue-3.0/series @@ -9,3 +9,4 @@ acpi-battery-fix-parsing-_bix-return-value.patch sched-fix-the-broken-sched_rr_get_interval.patch fanotify-info-leak-in-copy_event_to_user.patch maintainers-fix-up-stable_kernel_rules.txt-location.patch +perf-fix-event-group-context-move.patch -- 2.47.3