All of lore.kernel.org
 help / color / mirror / Atom feed
From: Steven Rostedt <rostedt@goodmis.org>
To: linux-kernel@vger.kernel.org
Cc: Ingo Molnar <mingo@kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	"Paul E. McKenney" <paulmck@linux.vnet.ibm.com>,
	"Joel Fernandes (Google)" <joel@joelfernandes.org>
Subject: [for-next][PATCH 34/34] tracepoints: Free early tracepoints after RCU is initialized
Date: Sat, 11 Aug 2018 09:50:02 -0400	[thread overview]
Message-ID: <20180811135017.655911310@goodmis.org> (raw)
In-Reply-To: 20180811134928.034373761@goodmis.org

From: "Steven Rostedt (VMware)" <rostedt@goodmis.org>

When enabling trace events via the kernel command line, I hit this warning:

WARNING: CPU: 0 PID: 13 at kernel/rcu/srcutree.c:236 check_init_srcu_struct+0xe/0x61
Modules linked in:
CPU: 0 PID: 13 Comm: watchdog/0 Not tainted 4.18.0-rc6-test+ #6
Hardware name: MSI MS-7823/CSM-H87M-G43 (MS-7823), BIOS V1.6 02/22/2014
RIP: 0010:check_init_srcu_struct+0xe/0x61
Code: 48 c7 c6 ec 8a 65 b4 e8 ff 79 fe ff 48 89 df 31 f6 e8 f2 fa ff ff 5a
5b 41 5c 5d c3 0f 1f 44 00 00 83 3d 68 94 b8 01 01 75 02 <0f> 0b 48 8b 87 f0
0a 00 00 a8 03 74 45 55 48 89 e5 41 55 41 54 4c
RSP: 0000:ffff96eb9ea03e68 EFLAGS: 00010246
RAX: ffff96eb962b5b01 RBX: ffffffffb4a87420 RCX: 0000000000000001
RDX: ffffffffb3107969 RSI: ffff96eb962b5b40 RDI: ffffffffb4a87420
RBP: ffff96eb9ea03eb0 R08: ffffabbd00cd7f48 R09: 0000000000000000
R10: ffff96eb9ea03e68 R11: ffffffffb4a6eec0 R12: ffff96eb962b5b40
R13: ffff96eb9ea03ef8 R14: ffffffffb3107969 R15: ffffffffb3107948
FS:  0000000000000000(0000) GS:ffff96eb9ea00000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: ffff96eb13ab2000 CR3: 0000000192a1e001 CR4: 00000000001606f0
Call Trace:
 <IRQ>
 ? __call_srcu+0x2d/0x290
 ? rcu_process_callbacks+0x26e/0x448
 ? allocate_probes+0x2b/0x2b
 call_srcu+0x13/0x15
 rcu_free_old_probes+0x1f/0x21
 rcu_process_callbacks+0x2ed/0x448
 __do_softirq+0x172/0x336
 irq_exit+0x62/0xb2
 smp_apic_timer_interrupt+0x161/0x19e
 apic_timer_interrupt+0xf/0x20
 </IRQ>

The problem is that the enabling of trace events before RCU is set up will
cause SRCU to give this warning. To avoid this, add a list to store probes
that need to be freed till after RCU is initialized, and then free them
then.

Link: http://lkml.kernel.org/r/20180810113554.1df28050@gandalf.local.home
Link: http://lkml.kernel.org/r/20180810123517.5e9714ad@gandalf.local.home

Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Fixes: e6753f23d961d ("tracepoint: Make rcuidle tracepoint callers use SRCU")
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
---
 kernel/tracepoint.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
index 955148d91b74..96db841bf0fc 100644
--- a/kernel/tracepoint.c
+++ b/kernel/tracepoint.c
@@ -53,6 +53,9 @@ static LIST_HEAD(tracepoint_module_list);
  */
 static DEFINE_MUTEX(tracepoints_mutex);
 
+static struct rcu_head *early_probes;
+static bool ok_to_free_tracepoints;
+
 /*
  * Note about RCU :
  * It is used to delay the free of multiple probes array until a quiescent
@@ -80,11 +83,40 @@ static void rcu_free_old_probes(struct rcu_head *head)
 	call_srcu(&tracepoint_srcu, head, srcu_free_old_probes);
 }
 
+static __init int release_early_probes(void)
+{
+	struct rcu_head *tmp;
+
+	ok_to_free_tracepoints = true;
+
+	while (early_probes) {
+		tmp = early_probes;
+		early_probes = tmp->next;
+		call_rcu_sched(tmp, rcu_free_old_probes);
+	}
+
+	return 0;
+}
+
+/* SRCU is initialized at core_initcall */
+postcore_initcall(release_early_probes);
+
 static inline void release_probes(struct tracepoint_func *old)
 {
 	if (old) {
 		struct tp_probes *tp_probes = container_of(old,
 			struct tp_probes, probes[0]);
+
+		/*
+		 * We can't free probes if SRCU is not initialized yet.
+		 * Postpone the freeing till after SRCU is initialized.
+		 */
+		if (unlikely(!ok_to_free_tracepoints)) {
+			tp_probes->rcu.next = early_probes;
+			early_probes = &tp_probes->rcu;
+			return;
+		}
+
 		/*
 		 * Tracepoint probes are protected by both sched RCU and SRCU,
 		 * by calling the SRCU callback in the sched RCU callback we
-- 
2.18.0



      parent reply	other threads:[~2018-08-11 13:50 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-11 13:49 [for-next][PATCH 00/34] tracing: My official queue finally passed testing and ready for linux-next Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 01/34] srcu: Add notrace variants of srcu_read_{lock,unlock} Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 02/34] srcu: Add notrace variant of srcu_dereference Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 03/34] tracing/irqsoff: Split reset into separate functions Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 04/34] lib: Add module for testing preemptoff/irqsoff latency tracers Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 05/34] kselftests: Add tests for the preemptoff and irqsoff tracers Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 06/34] tracing: Make unregister_trigger() static Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 07/34] tracing: Remove orphaned function using_ftrace_ops_list_func() Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 08/34] tracing: Remove orphaned function ftrace_nr_registered_ops() Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 09/34] tracing/kprobes: Simplify the logic of enable_trace_kprobe() Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 10/34] tracing: preemptirq_delay_run() can be static Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 11/34] tracing: kprobes: Prohibit probing on notrace function Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 12/34] selftest/ftrace: Move kprobe selftest function to separate compile unit Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 13/34] selftests/ftrace: Fix kprobe string testcase to not probe notrace function Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 14/34] lockdep: Use this_cpu_ptr instead of get_cpu_var stats Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 15/34] tracepoint: Make rcuidle tracepoint callers use SRCU Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 16/34] tracing: Centralize preemptirq tracepoints and unify their usage Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 17/34] tracefs: Annotate tracefs_ops with __ro_after_init Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 18/34] tracing: Do not call start/stop() functions when tracing_on does not change Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 19/34] ftrace: Add missing check for existing hwlat thread Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 20/34] tracing: Do a WARN_ON() if start_thread() in hwlat is called when thread exists Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 21/34] tracing: Make tracer_tracing_is_on() return bool Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 22/34] ring-buffer: Make ring_buffer_record_is_on() " Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 23/34] ring-buffer: Make ring_buffer_record_is_set_on() " Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 24/34] ftrace: Use true and false for boolean values in ops_references_rec() Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 25/34] tracing/kprobes: Fix within_notrace_func() to check only notrace functions Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 26/34] trace: Use rcu_dereference_raw for hooks from trace-event subsystem Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 27/34] tracing: irqsoff: Account for additional preempt_disable Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 28/34] tracing: Partial revert of "tracing: Centralize preemptirq tracepoints and unify their usage" Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 29/34] tracing/irqsoff: Handle preempt_count for different configs Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 30/34] tracing: More reverting of "tracing: Centralize preemptirq tracepoints and unify their usage" Steven Rostedt
2018-08-11 13:49 ` [for-next][PATCH 31/34] ftrace: Remove unused pointer ftrace_swapper_pid Steven Rostedt
2018-08-11 13:50 ` [for-next][PATCH 32/34] tracing: Fix synchronizing to event changes with tracepoint_synchronize_unregister() Steven Rostedt
2018-08-11 13:50 ` [for-next][PATCH 33/34] uprobes: Use synchronize_rcu() not synchronize_sched() Steven Rostedt
2018-08-11 13:50 ` Steven Rostedt [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180811135017.655911310@goodmis.org \
    --to=rostedt@goodmis.org \
    --cc=akpm@linux-foundation.org \
    --cc=joel@joelfernandes.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=paulmck@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.