public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 2/6] x86: allow to call text_poke_bp during boot
@ 2013-10-18 14:27 Petr Mladek
  2013-10-19 15:02 ` Masami Hiramatsu
  0 siblings, 1 reply; 9+ messages in thread
From: Petr Mladek @ 2013-10-18 14:27 UTC (permalink / raw)
  To: Steven Rostedt, Frederic Weisbecker, Masami Hiramatsu,
	Jiri Kosina
  Cc: linux-kernel, x86, Petr Mladek

We would like to use text_poke_bp in ftrace. It might be called also during
boot when the interupts are disabled. We need to enable them for syncing
the cores on each CPU. Otherwise, there might be a deadlock, see the
warning in "smp_call_function_many", kernel/smp.c:371.

This change is taken from the current code in arch/x86/kernel/ftrace.c.

Signed-off-by: Petr Mladek <pmladek@suse.cz>
---
 arch/x86/kernel/alternative.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
index f714316..13cae15 100644
--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -629,6 +629,20 @@ static void do_sync_core(void *info)
 	sync_core();
 }
 
+static void run_sync(void)
+{
+	int enable_irqs = irqs_disabled();
+
+	/* We may be called with interrupts disbled (on bootup). */
+	if (enable_irqs)
+		local_irq_enable();
+
+	on_each_cpu(do_sync_core, NULL, 1);
+
+	if (enable_irqs)
+		local_irq_disable();
+}
+
 static bool bp_patching_in_progress;
 static void *bp_int3_handler, *bp_int3_addr;
 
@@ -688,7 +702,7 @@ void *text_poke_bp(void *addr, const void *opcode, size_t len, void *handler)
 
 	text_poke_part(addr, &int3, sizeof(int3));
 
-	on_each_cpu(do_sync_core, NULL, 1);
+	run_sync();
 
 	if (len - sizeof(int3) > 0) {
 		/* patch all but the first byte */
@@ -700,13 +714,13 @@ void *text_poke_bp(void *addr, const void *opcode, size_t len, void *handler)
 		 * not necessary and we'd be safe even without it. But
 		 * better safe than sorry (plus there's not only Intel).
 		 */
-		on_each_cpu(do_sync_core, NULL, 1);
+		run_sync();
 	}
 
 	/* patch the first byte */
 	text_poke_part(addr, opcode, sizeof(int3));
 
-	on_each_cpu(do_sync_core, NULL, 1);
+	run_sync();
 
 	bp_patching_in_progress = false;
 	smp_wmb();
-- 
1.8.4


^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2013-10-28  9:18 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-18 14:27 [PATCH 2/6] x86: allow to call text_poke_bp during boot Petr Mladek
2013-10-19 15:02 ` Masami Hiramatsu
2013-10-19 19:16   ` Steven Rostedt
2013-10-19 19:19     ` Steven Rostedt
2013-10-19 21:33       ` Paul E. McKenney
2013-10-19 21:58         ` Steven Rostedt
2013-10-19 22:02         ` Steven Rostedt
2013-10-20 15:42           ` Paul E. McKenney
2013-10-28  9:18             ` Masami Hiramatsu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox