All of lore.kernel.org
 help / color / mirror / Atom feed
From: tip-bot for Andy Lutomirski <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, bp@alien8.de, tglx@linutronix.de,
	peterz@infradead.org, hpa@zytor.com, mingo@kernel.org,
	dvlasenk@redhat.com, jpoimboe@redhat.com, luto@kernel.org,
	brgerst@gmail.com, torvalds@linux-foundation.org
Subject: [tip:x86/mm] x86/dumpstack: When OOPSing, rewind the stack before do_exit()
Date: Fri, 15 Jul 2016 05:02:17 -0700	[thread overview]
Message-ID: <tip-2deb4be28077638591fe5fc593b7f8aabc140f42@git.kernel.org> (raw)
In-Reply-To: <32f73ceb372ec61889598da5e5b145889b9f2e19.1468527351.git.luto@kernel.org>

Commit-ID:  2deb4be28077638591fe5fc593b7f8aabc140f42
Gitweb:     http://git.kernel.org/tip/2deb4be28077638591fe5fc593b7f8aabc140f42
Author:     Andy Lutomirski <luto@kernel.org>
AuthorDate: Thu, 14 Jul 2016 13:22:55 -0700
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Fri, 15 Jul 2016 10:26:28 +0200

x86/dumpstack: When OOPSing, rewind the stack before do_exit()

If we call do_exit() with a clean stack, we greatly reduce the risk of
recursive oopses due to stack overflow in do_exit, and we allow
do_exit to work even if we OOPS from an IST stack.  The latter gives
us a much better chance of surviving long enough after we detect a
stack overflow to write out our logs.

Signed-off-by: Andy Lutomirski <luto@kernel.org>
Reviewed-by: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/32f73ceb372ec61889598da5e5b145889b9f2e19.1468527351.git.luto@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/x86/entry/entry_32.S   | 11 +++++++++++
 arch/x86/entry/entry_64.S   | 11 +++++++++++
 arch/x86/kernel/dumpstack.c | 10 +++++++++-
 3 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S
index 983e5d3..0b56666 100644
--- a/arch/x86/entry/entry_32.S
+++ b/arch/x86/entry/entry_32.S
@@ -1153,3 +1153,14 @@ ENTRY(async_page_fault)
 	jmp	error_code
 END(async_page_fault)
 #endif
+
+ENTRY(rewind_stack_do_exit)
+	/* Prevent any naive code from trying to unwind to our caller. */
+	xorl	%ebp, %ebp
+
+	movl	PER_CPU_VAR(cpu_current_top_of_stack), %esi
+	leal	-TOP_OF_KERNEL_STACK_PADDING-PTREGS_SIZE(%esi), %esp
+
+	call	do_exit
+1:	jmp 1b
+END(rewind_stack_do_exit)
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index 9ee0da1..b846875 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -1423,3 +1423,14 @@ ENTRY(ignore_sysret)
 	mov	$-ENOSYS, %eax
 	sysret
 END(ignore_sysret)
+
+ENTRY(rewind_stack_do_exit)
+	/* Prevent any naive code from trying to unwind to our caller. */
+	xorl	%ebp, %ebp
+
+	movq	PER_CPU_VAR(cpu_current_top_of_stack), %rax
+	leaq	-TOP_OF_KERNEL_STACK_PADDING-PTREGS_SIZE(%rax), %rsp
+
+	call	do_exit
+1:	jmp 1b
+END(rewind_stack_do_exit)
diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c
index cc88e25..de8242d 100644
--- a/arch/x86/kernel/dumpstack.c
+++ b/arch/x86/kernel/dumpstack.c
@@ -234,6 +234,8 @@ unsigned long oops_begin(void)
 EXPORT_SYMBOL_GPL(oops_begin);
 NOKPROBE_SYMBOL(oops_begin);
 
+void __noreturn rewind_stack_do_exit(int signr);
+
 void oops_end(unsigned long flags, struct pt_regs *regs, int signr)
 {
 	if (regs && kexec_should_crash(current))
@@ -255,7 +257,13 @@ void oops_end(unsigned long flags, struct pt_regs *regs, int signr)
 		panic("Fatal exception in interrupt");
 	if (panic_on_oops)
 		panic("Fatal exception");
-	do_exit(signr);
+
+	/*
+	 * We're not going to return, but we might be on an IST stack or
+	 * have very little stack space left.  Rewind the stack and kill
+	 * the task.
+	 */
+	rewind_stack_do_exit(signr);
 }
 NOKPROBE_SYMBOL(oops_end);
 

  reply	other threads:[~2016-07-15 12:03 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-14 20:22 [PATCH 00/11] x86: misc prep patches for virtually mapped stacks Andy Lutomirski
2016-07-14 20:22 ` [PATCH 01/11] x86/mm/hotplug: Don't remove PGD entries in remove_pagetable() Andy Lutomirski
2016-07-14 20:22   ` Andy Lutomirski
2016-07-15 11:59   ` [tip:x86/mm] " tip-bot for Ingo Molnar
2016-07-14 20:22 ` [PATCH 02/11] x86/cpa: In populate_pgd, don't set the pgd entry until it's populated Andy Lutomirski
2016-07-15 11:59   ` [tip:x86/mm] x86/mm/cpa: In populate_pgd(), don't set the PGD " tip-bot for Andy Lutomirski
2016-07-14 20:22 ` [PATCH 03/11] x86/mm: Remove kernel_unmap_pages_in_pgd() and efi_cleanup_page_tables() Andy Lutomirski
2016-07-15 12:00   ` [tip:x86/mm] " tip-bot for Andy Lutomirski
2016-07-14 20:22 ` [PATCH 04/11] x86/dumpstack: Try harder to get a call trace on stack overflow Andy Lutomirski
2016-07-15 12:00   ` [tip:x86/mm] " tip-bot for Andy Lutomirski
2016-07-14 20:22 ` [PATCH 05/11] x86/dumpstack/64: Handle faults when printing the "Stack:" part of an OOPS Andy Lutomirski
2016-07-15 12:01   ` [tip:x86/mm] x86/dumpstack/64: Handle faults when printing the "Stack: " " tip-bot for Andy Lutomirski
2016-07-14 20:22 ` [PATCH 06/11] x86/mm/64: In vmalloc_fault(), use CR3 instead of current->active_mm Andy Lutomirski
2016-07-15 12:01   ` [tip:x86/mm] " tip-bot for Andy Lutomirski
2016-07-14 20:22 ` [PATCH 07/11] x86/dumpstack: When OOPSing, rewind the stack before do_exit() Andy Lutomirski
2016-07-15 12:02   ` tip-bot for Andy Lutomirski [this message]
2016-07-14 20:22 ` [PATCH 08/11] x86: Move uaccess_err and sig_on_uaccess_err to thread_struct Andy Lutomirski
2016-07-15  8:14   ` Ingo Molnar
2016-07-15 12:02   ` [tip:x86/mm] x86/uaccess: Move thread_info::uaccess_err and thread_info::sig_on_uaccess_err " tip-bot for Andy Lutomirski
2016-07-14 20:22 ` [PATCH 09/11] x86: Move addr_limit " Andy Lutomirski
2016-07-15 12:03   ` [tip:x86/mm] x86/uaccess: Move thread_info::addr_limit " tip-bot for Andy Lutomirski
2016-07-14 20:22 ` [PATCH 10/11] x86/smp: Remove stack_smp_processor_id() Andy Lutomirski
2016-07-15 12:04   ` [tip:x86/mm] " tip-bot for Andy Lutomirski
2016-07-14 20:22 ` [PATCH 11/11] x86/smp: Remove unnecessary initialization of thread_info::cpu Andy Lutomirski
2016-07-15 12:04   ` [tip:x86/mm] " tip-bot for Andy Lutomirski

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=tip-2deb4be28077638591fe5fc593b7f8aabc140f42@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=bp@alien8.de \
    --cc=brgerst@gmail.com \
    --cc=dvlasenk@redhat.com \
    --cc=hpa@zytor.com \
    --cc=jpoimboe@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    /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.