From: Greg Kroah-Hartman Date: Tue, 4 Mar 2014 18:17:29 +0000 (-0800) Subject: 3.4-stable patches X-Git-Tag: v3.10.33~19 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5efe5c593c4ea55e22d43bd6041fb43a393b7c4a;p=thirdparty%2Fkernel%2Fstable-queue.git 3.4-stable patches added patches: perf-fix-hotplug-splat.patch --- diff --git a/queue-3.4/perf-fix-hotplug-splat.patch b/queue-3.4/perf-fix-hotplug-splat.patch new file mode 100644 index 00000000000..aea72214fb3 --- /dev/null +++ b/queue-3.4/perf-fix-hotplug-splat.patch @@ -0,0 +1,66 @@ +From e3703f8cdfcf39c25c4338c3ad8e68891cca3731 Mon Sep 17 00:00:00 2001 +From: Peter Zijlstra +Date: Mon, 24 Feb 2014 12:06:12 +0100 +Subject: perf: Fix hotplug splat + +From: Peter Zijlstra + +commit e3703f8cdfcf39c25c4338c3ad8e68891cca3731 upstream. + +Drew Richardson reported that he could make the kernel go *boom* when hotplugging +while having perf events active. + +It turned out that when you have a group event, the code in +__perf_event_exit_context() fails to remove the group siblings from +the context. + +We then proceed with destroying and freeing the event, and when you +re-plug the CPU and try and add another event to that CPU, things go +*boom* because you've still got dead entries there. + +Reported-by: Drew Richardson +Signed-off-by: Peter Zijlstra +Cc: Will Deacon +Link: http://lkml.kernel.org/n/tip-k6v5wundvusvcseqj1si0oz0@git.kernel.org +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/events/core.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +--- a/kernel/events/core.c ++++ b/kernel/events/core.c +@@ -7149,14 +7149,14 @@ static void perf_pmu_rotate_stop(struct + static void __perf_event_exit_context(void *__info) + { + struct perf_event_context *ctx = __info; +- struct perf_event *event, *tmp; ++ struct perf_event *event; + + perf_pmu_rotate_stop(ctx->pmu); + +- list_for_each_entry_safe(event, tmp, &ctx->pinned_groups, group_entry) +- __perf_remove_from_context(event); +- list_for_each_entry_safe(event, tmp, &ctx->flexible_groups, group_entry) ++ rcu_read_lock(); ++ list_for_each_entry_rcu(event, &ctx->event_list, event_entry) + __perf_remove_from_context(event); ++ rcu_read_unlock(); + } + + static void perf_event_exit_cpu_context(int cpu) +@@ -7180,11 +7180,11 @@ static void perf_event_exit_cpu(int cpu) + { + struct swevent_htable *swhash = &per_cpu(swevent_htable, cpu); + ++ perf_event_exit_cpu_context(cpu); ++ + mutex_lock(&swhash->hlist_mutex); + swevent_hlist_release(swhash); + mutex_unlock(&swhash->hlist_mutex); +- +- perf_event_exit_cpu_context(cpu); + } + #else + static inline void perf_event_exit_cpu(int cpu) { } diff --git a/queue-3.4/series b/queue-3.4/series index 996204d87a7..529977e7eb1 100644 --- a/queue-3.4/series +++ b/queue-3.4/series @@ -35,3 +35,4 @@ usb-serial-option-blacklist-interface-4-for-cinterion-phs8-and-pxs8.patch usb-ftdi_sio-add-cressi-leonardo-pid.patch hwmon-max1668-fix-writing-the-minimum-temperature.patch workqueue-ensure-task-is-valid-across-kthread_stop.patch +perf-fix-hotplug-splat.patch