From: Greg Kroah-Hartman Date: Tue, 1 Mar 2016 05:07:58 +0000 (-0800) Subject: 3.14-stable patches X-Git-Tag: v3.10.99~62 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6bcccfeb316124f84fe6248ef3ef9e7f2f524475;p=thirdparty%2Fkernel%2Fstable-queue.git 3.14-stable patches added patches: tracepoints-do-not-trace-when-cpu-is-offline.patch --- diff --git a/queue-3.14/tracepoints-do-not-trace-when-cpu-is-offline.patch b/queue-3.14/tracepoints-do-not-trace-when-cpu-is-offline.patch new file mode 100644 index 00000000000..fee89aa0c98 --- /dev/null +++ b/queue-3.14/tracepoints-do-not-trace-when-cpu-is-offline.patch @@ -0,0 +1,90 @@ +From f37755490fe9bf76f6ba1d8c6591745d3574a6a6 Mon Sep 17 00:00:00 2001 +From: "Steven Rostedt (Red Hat)" +Date: Mon, 15 Feb 2016 12:36:14 -0500 +Subject: tracepoints: Do not trace when cpu is offline + +From: Steven Rostedt (Red Hat) + +commit f37755490fe9bf76f6ba1d8c6591745d3574a6a6 upstream. + +The tracepoint infrastructure uses RCU sched protection to enable and +disable tracepoints safely. There are some instances where tracepoints are +used in infrastructure code (like kfree()) that get called after a CPU is +going offline, and perhaps when it is coming back online but hasn't been +registered yet. + +This can probuce the following warning: + + [ INFO: suspicious RCU usage. ] + 4.4.0-00006-g0fe53e8-dirty #34 Tainted: G S + ------------------------------- + include/trace/events/kmem.h:141 suspicious rcu_dereference_check() usage! + + other info that might help us debug this: + + RCU used illegally from offline CPU! rcu_scheduler_active = 1, debug_locks = 1 + no locks held by swapper/8/0. + + stack backtrace: + CPU: 8 PID: 0 Comm: swapper/8 Tainted: G S 4.4.0-00006-g0fe53e8-dirty #34 + Call Trace: + [c0000005b76c78d0] [c0000000008b9540] .dump_stack+0x98/0xd4 (unreliable) + [c0000005b76c7950] [c00000000010c898] .lockdep_rcu_suspicious+0x108/0x170 + [c0000005b76c79e0] [c00000000029adc0] .kfree+0x390/0x440 + [c0000005b76c7a80] [c000000000055f74] .destroy_context+0x44/0x100 + [c0000005b76c7b00] [c0000000000934a0] .__mmdrop+0x60/0x150 + [c0000005b76c7b90] [c0000000000e3ff0] .idle_task_exit+0x130/0x140 + [c0000005b76c7c20] [c000000000075804] .pseries_mach_cpu_die+0x64/0x310 + [c0000005b76c7cd0] [c000000000043e7c] .cpu_die+0x3c/0x60 + [c0000005b76c7d40] [c0000000000188d8] .arch_cpu_idle_dead+0x28/0x40 + [c0000005b76c7db0] [c000000000101e6c] .cpu_startup_entry+0x50c/0x560 + [c0000005b76c7ed0] [c000000000043bd8] .start_secondary+0x328/0x360 + [c0000005b76c7f90] [c000000000008a6c] start_secondary_prolog+0x10/0x14 + +This warning is not a false positive either. RCU is not protecting code that +is being executed while the CPU is offline. + +Instead of playing "whack-a-mole(TM)" and adding conditional statements to +the tracepoints we find that are used in this instance, simply add a +cpu_online() test to the tracepoint code where the tracepoint will be +ignored if the CPU is offline. + +Use of raw_smp_processor_id() is fine, as there should never be a case where +the tracepoint code goes from running on a CPU that is online and suddenly +gets migrated to a CPU that is offline. + +Link: http://lkml.kernel.org/r/1455387773-4245-1-git-send-email-kda@linux-powerpc.org + +Reported-by: Denis Kirjanov +Fixes: 97e1c18e8d17b ("tracing: Kernel Tracepoints") +Signed-off-by: Steven Rostedt +Signed-off-by: Greg Kroah-Hartman + +--- + include/linux/tracepoint.h | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/include/linux/tracepoint.h ++++ b/include/linux/tracepoint.h +@@ -14,8 +14,11 @@ + * See the file COPYING for more details. + */ + ++#include + #include + #include ++#include ++#include + #include + #include + +@@ -126,6 +129,9 @@ static inline void tracepoint_synchroniz + void *it_func; \ + void *__data; \ + \ ++ if (!cpu_online(raw_smp_processor_id())) \ ++ return; \ ++ \ + if (!(cond)) \ + return; \ + prercu; \