public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Vince Weaver <vincent.weaver@maine.edu>
Cc: Ingo Molnar <mingo@kernel.org>,
	linux-kernel@vger.kernel.org, Ingo Molnar <mingo@redhat.com>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: Re: perf: perf_fuzzer quickly locks up on 4.15-rc7
Date: Tue, 9 Jan 2018 16:33:41 +0100	[thread overview]
Message-ID: <20180109153341.GL6176@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <alpine.DEB.2.21.1801091022040.16446@macbook-air>

On Tue, Jan 09, 2018 at 10:24:55AM -0500, Vince Weaver wrote:
> On Tue, 9 Jan 2018, Peter Zijlstra wrote:
> 
> > > I'll try your patch and see if it makes a difference.
> > 
> > I suspect not, it shouldn't be PTI specific.
> 
> yes, applying your patch didn't help, still locks up on the Haswell 
> machine.

So CONFIG_PAGE_TABLE_ISOLATION=y and booting with "pti=off" makes it
'work', right?

> Is there any debugging I could turn on that would help?  I tried KASAN 
> but it didn't help.  I think I have the regular lockdep stuff enabled.
> 
> alt-sysrq doesn't work either (or at least, the version using BREAK over 
> the serial console doesn't, I can maybe try hooking up a keyboard/display 
> to see if that helps).

The below is always my first try to get something out of the machine,
after that its printk() stuffing code to see how far we get..

In particular I'd start instrumenting the NMI entry_64.S code, because
that's really the biggest difference between PTI and !PTI :/ all rather
bothersome I'm afraid.

Really sucks I cannot as yet reproduce.

---
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 5e486b6509e5..fc9021fd6e3c 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -1172,6 +1172,11 @@
 			parameter will force ia64_sal_cache_flush to call
 			ia64_pal_cache_flush instead of SAL_CACHE_FLUSH.
 
+	force_early_printk
+			Forcefully uses early_console (as per earlyprintk=)
+			usage for regular printk, bypassing everything,
+			including the syslog (dmesg will be empty).
+
 	forcepae [X86-32]
 			Forcefully enable Physical Address Extension (PAE).
 			Many Pentium M systems disable PAE but may have a
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index b9006617710f..c1a4ed17c22c 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -365,6 +365,75 @@ __packed __aligned(4)
 #endif
 ;
 
+#ifdef CONFIG_EARLY_PRINTK
+struct console *early_console;
+
+static bool __read_mostly force_early_printk;
+
+static int __init force_early_printk_setup(char *str)
+{
+	force_early_printk = true;
+	return 0;
+}
+early_param("force_early_printk", force_early_printk_setup);
+
+static int early_printk_cpu = -1;
+
+static int early_vprintk(const char *fmt, va_list args)
+{
+	int n, cpu, old;
+	char buf[512];
+
+	cpu = get_cpu();
+	/*
+	 * Test-and-Set inter-cpu spinlock with recursion.
+	 */
+	for (;;) {
+		/*
+		 * c-cas to avoid the exclusive bouncing on spin.
+		 * Depends on the memory barrier implied by cmpxchg
+		 * for ACQUIRE semantics.
+		 */
+		old = READ_ONCE(early_printk_cpu);
+		if (old == -1) {
+			old = cmpxchg(&early_printk_cpu, -1, cpu);
+			if (old == -1)
+				break;
+		}
+		/*
+		 * Allow recursion for interrupts and the like.
+		 */
+		if (old == cpu)
+			break;
+
+		cpu_relax();
+	}
+
+	n = vscnprintf(buf, sizeof(buf), fmt, args);
+	early_console->write(early_console, buf, n);
+
+	/*
+	 * Unlock -- in case @old == @cpu, this is a no-op.
+	 */
+	smp_store_release(&early_printk_cpu, old);
+	put_cpu();
+
+	return n;
+}
+
+asmlinkage __visible void early_printk(const char *fmt, ...)
+{
+	va_list ap;
+
+	if (!early_console)
+		return;
+
+	va_start(ap, fmt);
+	early_vprintk(fmt, ap);
+	va_end(ap);
+}
+#endif
+
 /*
  * The logbuf_lock protects kmsg buffer, indices, counters.  This can be taken
  * within the scheduler's rq lock. It must be released before calling
@@ -1692,6 +1761,16 @@ asmlinkage int vprintk_emit(int facility, int level,
 	int printed_len;
 	bool in_sched = false;
 
+#ifdef CONFIG_KGDB_KDB
+	if (unlikely(kdb_trap_printk && kdb_printf_cpu < 0))
+		return vkdb_printf(KDB_MSGSRC_PRINTK, fmt, args);
+#endif
+
+#ifdef CONFIG_EARLY_PRINTK
+	if (force_early_printk && early_console)
+		return early_vprintk(fmt, args);
+#endif
+
 	if (level == LOGLEVEL_SCHED) {
 		level = LOGLEVEL_DEFAULT;
 		in_sched = true;
@@ -1784,18 +1863,7 @@ EXPORT_SYMBOL(printk_emit);
 
 int vprintk_default(const char *fmt, va_list args)
 {
-	int r;
-
-#ifdef CONFIG_KGDB_KDB
-	/* Allow to pass printk() to kdb but avoid a recursion. */
-	if (unlikely(kdb_trap_printk && kdb_printf_cpu < 0)) {
-		r = vkdb_printf(KDB_MSGSRC_PRINTK, fmt, args);
-		return r;
-	}
-#endif
-	r = vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, 0, fmt, args);
-
-	return r;
+	return vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, 0, fmt, args);
 }
 EXPORT_SYMBOL_GPL(vprintk_default);
 
@@ -1826,7 +1894,12 @@ asmlinkage __visible int printk(const char *fmt, ...)
 	int r;
 
 	va_start(args, fmt);
-	r = vprintk_func(fmt, args);
+#ifdef CONFIG_EARLY_PRINTK
+	if (force_early_printk && early_console)
+		r = vprintk_default(fmt, args);
+	else
+#endif
+		r = vprintk_func(fmt, args);
 	va_end(args);
 
 	return r;
@@ -1863,26 +1936,6 @@ static bool suppress_message_printing(int level) { return false; }
 
 #endif /* CONFIG_PRINTK */
 
-#ifdef CONFIG_EARLY_PRINTK
-struct console *early_console;
-
-asmlinkage __visible void early_printk(const char *fmt, ...)
-{
-	va_list ap;
-	char buf[512];
-	int n;
-
-	if (!early_console)
-		return;
-
-	va_start(ap, fmt);
-	n = vscnprintf(buf, sizeof(buf), fmt, ap);
-	va_end(ap);
-
-	early_console->write(early_console, buf, n);
-}
-#endif
-
 static int __add_preferred_console(char *name, int idx, char *options,
 				   char *brl_options)
 {

  reply	other threads:[~2018-01-09 15:33 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-08 16:12 perf: perf_fuzzer quickly locks up on 4.15-rc7 Vince Weaver
2018-01-08 17:30 ` Ingo Molnar
2018-01-08 20:29   ` Vince Weaver
2018-01-09 10:25     ` Peter Zijlstra
2018-01-09 13:26       ` Peter Zijlstra
2018-01-09 13:36         ` Peter Zijlstra
2018-01-09 13:44         ` Vince Weaver
2018-01-09 15:12           ` Peter Zijlstra
2018-01-09 15:24             ` Vince Weaver
2018-01-09 15:33               ` Peter Zijlstra [this message]
2018-01-09 15:56                 ` Vince Weaver
2018-01-09 16:05                   ` Peter Zijlstra
2018-01-09 17:07                     ` Josh Poimboeuf
2018-01-11  5:25                       ` Josh Poimboeuf
2018-01-11 19:00                         ` Vince Weaver
2018-01-11 19:21                           ` Josh Poimboeuf
2018-01-11 19:50                             ` Peter Zijlstra
2018-01-11 19:57                               ` Vince Weaver
2018-01-11 20:43                                 ` Vince Weaver
2018-05-01 13:29                             ` perf: fuzzer causes stack going in wrong direction warnings Vince Weaver
2018-05-01 13:58                               ` Josh Poimboeuf
2018-05-01 19:59                                 ` Vince Weaver
2018-05-01 22:04                                   ` Josh Poimboeuf
2018-05-02 20:50                                     ` Josh Poimboeuf
2018-05-04 14:35                                       ` Vince Weaver
2018-05-04 16:25                                         ` Josh Poimboeuf
2018-05-04 17:00                                           ` Vince Weaver
2018-05-05 15:38                                           ` Vince Weaver
2018-05-05 18:29                                             ` Josh Poimboeuf
2018-05-06 23:49                                               ` Josh Poimboeuf
2018-05-10 13:48                                                 ` Peter Zijlstra
2018-05-10 14:27                                                   ` Josh Poimboeuf
2018-05-10 23:16                                                   ` Josh Poimboeuf
2018-01-09 16:16                 ` perf: perf_fuzzer quickly locks up on 4.15-rc7 Ingo Molnar
2018-01-09 16:20                   ` Peter Zijlstra
2018-01-09 17:18                 ` Vince Weaver
2018-01-10 15:28                   ` Vince Weaver
2018-01-09 16:14             ` Peter Zijlstra
2018-01-09 17:53               ` Steven Rostedt
2018-01-09 18:02                 ` Peter Zijlstra
2018-01-09 18:09                   ` Steven Rostedt
2018-01-09 19:53                     ` Peter Zijlstra
2018-01-11  9:13           ` Peter Zijlstra
2018-01-11 15:26             ` Vince Weaver
2018-01-11 15:38               ` Peter Zijlstra
2018-01-11 16:41                 ` Vince Weaver
2018-01-11 16:58                   ` Vince Weaver
2018-01-11 17:03                     ` Peter Zijlstra
2018-01-11 18:04                       ` Vince Weaver
2018-01-11 18:20                         ` Vince Weaver
2018-01-11 19:01                           ` Peter Zijlstra
2018-01-11 19:11                       ` Peter Zijlstra
2018-01-11 20:15                         ` Vince Weaver
2018-01-11 20:40                           ` Vince Weaver
2018-01-11 20:57                             ` Peter Zijlstra
2018-01-12 19:48                               ` Vince Weaver
2018-01-11 20:42                           ` Peter Zijlstra
2018-01-11 15:29             ` Peter Zijlstra

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=20180109153341.GL6176@hirez.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --cc=acme@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=mingo@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=vincent.weaver@maine.edu \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox