From: Greg Kroah-Hartman Date: Fri, 3 Oct 2014 20:16:06 +0000 (-0700) Subject: 3.10-stable patches X-Git-Tag: v3.16.4~17 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e62cb1f27949394202524ab0511d683fe9a06fd1;p=thirdparty%2Fkernel%2Fstable-queue.git 3.10-stable patches added patches: perf-fix-a-race-condition-in-perf_remove_from_context.patch perf-kmem-make-it-work-again-on-non-numa-machines.patch --- diff --git a/queue-3.10/perf-fix-a-race-condition-in-perf_remove_from_context.patch b/queue-3.10/perf-fix-a-race-condition-in-perf_remove_from_context.patch new file mode 100644 index 00000000000..12d856be120 --- /dev/null +++ b/queue-3.10/perf-fix-a-race-condition-in-perf_remove_from_context.patch @@ -0,0 +1,63 @@ +From 3577af70a2ce4853d58e57d832e687d739281479 Mon Sep 17 00:00:00 2001 +From: Cong Wang +Date: Tue, 2 Sep 2014 15:27:20 -0700 +Subject: perf: Fix a race condition in perf_remove_from_context() + +From: Cong Wang + +commit 3577af70a2ce4853d58e57d832e687d739281479 upstream. + +We saw a kernel soft lockup in perf_remove_from_context(), +it looks like the `perf` process, when exiting, could not go +out of the retry loop. Meanwhile, the target process was forking +a child. So either the target process should execute the smp +function call to deactive the event (if it was running) or it should +do a context switch which deactives the event. + +It seems we optimize out a context switch in perf_event_context_sched_out(), +and what's more important, we still test an obsolete task pointer when +retrying, so no one actually would deactive that event in this situation. +Fix it directly by reloading the task pointer in perf_remove_from_context(). + +This should cure the above soft lockup. + +Signed-off-by: Cong Wang +Signed-off-by: Cong Wang +Signed-off-by: Peter Zijlstra +Cc: Paul Mackerras +Cc: Arnaldo Carvalho de Melo +Cc: Linus Torvalds +Link: http://lkml.kernel.org/r/1409696840-843-1-git-send-email-xiyou.wangcong@gmail.com +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/events/core.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/kernel/events/core.c ++++ b/kernel/events/core.c +@@ -1398,6 +1398,11 @@ retry: + */ + if (ctx->is_active) { + raw_spin_unlock_irq(&ctx->lock); ++ /* ++ * Reload the task pointer, it might have been changed by ++ * a concurrent perf_event_context_sched_out(). ++ */ ++ task = ctx->task; + goto retry; + } + +@@ -1829,6 +1834,11 @@ retry: + */ + if (ctx->is_active) { + raw_spin_unlock_irq(&ctx->lock); ++ /* ++ * Reload the task pointer, it might have been changed by ++ * a concurrent perf_event_context_sched_out(). ++ */ ++ task = ctx->task; + goto retry; + } + diff --git a/queue-3.10/perf-kmem-make-it-work-again-on-non-numa-machines.patch b/queue-3.10/perf-kmem-make-it-work-again-on-non-numa-machines.patch new file mode 100644 index 00000000000..0b7a3cbeb95 --- /dev/null +++ b/queue-3.10/perf-kmem-make-it-work-again-on-non-numa-machines.patch @@ -0,0 +1,42 @@ +From 4921e320244e099bdf237fd10428594ce5f5b87d Mon Sep 17 00:00:00 2001 +From: Jiri Olsa +Date: Thu, 12 Sep 2013 18:39:36 +0200 +Subject: perf kmem: Make it work again on non NUMA machines + +From: Jiri Olsa + +commit 4921e320244e099bdf237fd10428594ce5f5b87d upstream. + +The commit '2814eb0 perf kmem: Remove die() calls' disabled 'perf kmem' +command for machines without numa support. It made the command fail if +'/sys/devices/system/node' dir wasn't found. + +Skipping the numa based initialization in case the directory is not +found and continue execution. + +Signed-off-by: Jiri Olsa +Cc: Corey Ashford +Cc: Frederic Weisbecker +Cc: Namhyung Kim +Cc: Paul Mackerras +Cc: Peter Zijlstra +Link: http://lkml.kernel.org/r/1379003976-5839-5-git-send-email-jolsa@redhat.com +Signed-off-by: Arnaldo Carvalho de Melo +Cc: zhangzhiqiang +Signed-off-by: Greg Kroah-Hartman + +--- + tools/perf/builtin-kmem.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/tools/perf/builtin-kmem.c ++++ b/tools/perf/builtin-kmem.c +@@ -101,7 +101,7 @@ static int setup_cpunode_map(void) + + dir1 = opendir(PATH_SYS_NODE); + if (!dir1) +- return -1; ++ return 0; + + while ((dent1 = readdir(dir1)) != NULL) { + if (dent1->d_type != DT_DIR || diff --git a/queue-3.10/series b/queue-3.10/series index bb9e4eac3a0..664124d9ffa 100644 --- a/queue-3.10/series +++ b/queue-3.10/series @@ -120,3 +120,5 @@ powerpc-perf-fix-abiv2-kernel-backtraces.patch parisc-only-use-mfast-indirect-calls-option-for-32-bit-kernel-builds.patch alarmtimer-do-not-signal-sigev_none-timers.patch alarmtimer-lock-k_itimer-during-timer-callback.patch +perf-fix-a-race-condition-in-perf_remove_from_context.patch +perf-kmem-make-it-work-again-on-non-numa-machines.patch