All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org,
	cebbert@redhat.com, patches@x86-64.org
Cc: Justin Forbes <jmforbes@linuxtx.org>,
	Zwane Mwaikambo <zwane@arm.linux.org.uk>,
	"Theodore Ts'o" <tytso@mit.edu>,
	Randy Dunlap <rdunlap@xenotime.net>,
	Dave Jones <davej@redhat.com>,
	Chuck Wolber <chuckw@quantumlinux.com>,
	Chris Wedgwood <reviews@ml.cw.f00f.org>,
	Michael Krufky <mkrufky@linuxtv.org>,
	Domenico Andreoli <cavokz@gmail.com>,
	torvalds@linux-foundation.org, akpm@linux-foundation.org,
	alan@lxorguk.ukuu.org.uk, Andi Kleen <ak@suse.de>,
	Greg Kroah-Hartman <gregkh@suse.de>
Subject: [patch 19/20] i386: Fix double fault handler
Date: Mon, 20 Aug 2007 23:56:05 -0700	[thread overview]
Message-ID: <20070821065605.GT5275@kroah.com> (raw)
In-Reply-To: <20070821065210.GA5275@kroah.com>

[-- Attachment #1: i386-fix-double-fault-handler.patch --]
[-- Type: text/plain, Size: 2762 bytes --]


-stable review patch.  If anyone has any objections, please let us know.

------------------
From: Chuck Ebbert <cebbert@redhat.com>

The new percpu code has apparently broken the doublefault handler
when CONFIG_DEBUG_SPINLOCK is set. Doublefault is handled by
a hardware task, making the check

        SPIN_BUG_ON(lock->owner == current, lock, "recursion");

fault because it uses the FS register to access the percpu data
for current, and that register is zero in the new TSS. (The trace
I saw was on 2.6.20 where it was GS, but it looks like this will
still happen with FS on 2.6.22.)

Initializing FS in the doublefault_tss should fix it.

AK: Also fix broken ptr_ok() and turn printks into KERN_EMERG
AK: And add a PANIC prefix to make clear the system will hang
AK: (e.g. x86-64 will recover)

Signed-off-by: Chuck Ebbert <cebbert@redhat.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>


---
 arch/i386/kernel/doublefault.c |   13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

--- a/arch/i386/kernel/doublefault.c
+++ b/arch/i386/kernel/doublefault.c
@@ -13,7 +13,7 @@
 static unsigned long doublefault_stack[DOUBLEFAULT_STACKSIZE];
 #define STACK_START (unsigned long)(doublefault_stack+DOUBLEFAULT_STACKSIZE)
 
-#define ptr_ok(x) ((x) > PAGE_OFFSET && (x) < PAGE_OFFSET + 0x1000000)
+#define ptr_ok(x) ((x) > PAGE_OFFSET && (x) < PAGE_OFFSET + MAXMEM)
 
 static void doublefault_fn(void)
 {
@@ -23,23 +23,23 @@ static void doublefault_fn(void)
 	store_gdt(&gdt_desc);
 	gdt = gdt_desc.address;
 
-	printk("double fault, gdt at %08lx [%d bytes]\n", gdt, gdt_desc.size);
+	printk(KERN_EMERG "PANIC: double fault, gdt at %08lx [%d bytes]\n", gdt, gdt_desc.size);
 
 	if (ptr_ok(gdt)) {
 		gdt += GDT_ENTRY_TSS << 3;
 		tss = *(u16 *)(gdt+2);
 		tss += *(u8 *)(gdt+4) << 16;
 		tss += *(u8 *)(gdt+7) << 24;
-		printk("double fault, tss at %08lx\n", tss);
+		printk(KERN_EMERG "double fault, tss at %08lx\n", tss);
 
 		if (ptr_ok(tss)) {
 			struct i386_hw_tss *t = (struct i386_hw_tss *)tss;
 
-			printk("eip = %08lx, esp = %08lx\n", t->eip, t->esp);
+			printk(KERN_EMERG "eip = %08lx, esp = %08lx\n", t->eip, t->esp);
 
-			printk("eax = %08lx, ebx = %08lx, ecx = %08lx, edx = %08lx\n",
+			printk(KERN_EMERG "eax = %08lx, ebx = %08lx, ecx = %08lx, edx = %08lx\n",
 				t->eax, t->ebx, t->ecx, t->edx);
-			printk("esi = %08lx, edi = %08lx\n",
+			printk(KERN_EMERG "esi = %08lx, edi = %08lx\n",
 				t->esi, t->edi);
 		}
 	}
@@ -63,6 +63,7 @@ struct tss_struct doublefault_tss __cach
 		.cs		= __KERNEL_CS,
 		.ss		= __KERNEL_DS,
 		.ds		= __USER_DS,
+		.fs		= __KERNEL_PERCPU,
 
 		.__cr3		= __pa(swapper_pg_dir)
 	}

-- 

  parent reply	other threads:[~2007-08-21  6:59 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20070821064251.972690753@blue.kroah.org>
2007-08-21  6:52 ` [patch 00/20] 2.6.22-stable review Greg KH
2007-08-21  6:53   ` [patch 01/20] hwmon: fix w83781d temp sensor type setting Greg KH
2007-08-21  6:53   ` [patch 02/20] hwmon: (smsc47m1) restore missing name attribute Greg KH
2007-08-21  6:53   ` [patch 03/20] sky2: restore workarounds for lost interrupts Greg KH
2007-08-21  6:54   ` [patch 04/20] sky2: carrier management Greg KH
2007-08-21  6:54   ` [patch 05/20] sky2: check for more work before leaving NAPI Greg KH
2007-08-21  6:54   ` [patch 06/20] sky2: check drop truncated packets Greg KH
2007-08-21 18:10     ` [PATCH] sky2: don't clear phy power bits Stephen Hemminger
2007-08-21 18:26       ` Linus Torvalds
2007-08-21 18:50         ` Stephen Hemminger
2007-08-21  6:54   ` [patch 07/20] revert "x86, serial: convert legacy COM ports to platform devices" Greg KH
2007-08-21  6:54   ` [patch 08/20] ACPICA: Fixed possible corruption of global GPE list Greg KH
2007-08-21  6:55   ` [patch 09/20] ACPICA: Clear reserved fields for incoming ACPI 1.0 FADTs Greg KH
2007-08-21  6:55   ` [patch 10/20] AVR32: Fix atomic_add_unless() and atomic_sub_unless() Greg KH
2007-08-21  6:55   ` [patch 11/20] r8169: avoid needless NAPI poll scheduling Greg KH
2007-08-21  6:55   ` [patch 12/20] forcedeth: fix random hang in forcedeth driver when using netconsole Greg KH
2007-08-21  6:55   ` [patch 13/20] libata: add ATI SB700 device IDs to AHCI driver Greg KH
2007-08-21  6:55   ` [patch 14/20] Hibernation: do not try to mark invalid PFNs as nosave Greg KH
2007-08-21  6:55   ` [patch 15/20] i386: allow debuggers to access the vsyscall page with compat vDSO Greg KH
2007-08-21  6:55   ` [patch 16/20] x86_64: Check for .cfi_rel_offset in CFI probe Greg KH
2007-08-21  6:55   ` [patch 17/20] x86_64: Change PMDS invocation to single macro Greg KH
2007-08-21  6:56   ` [patch 18/20] i386: Handle P6s without performance counters in nmi watchdog Greg KH
2007-08-21  6:56   ` Greg KH [this message]
2007-08-21  6:56   ` [patch 20/20] JFFS2 locking regression fix Greg KH
2007-08-21 15:33   ` [patch 00/20] 2.6.22-stable review Justin M. Forbes
2007-08-23  0:10     ` [stable] " Greg KH

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=20070821065605.GT5275@kroah.com \
    --to=gregkh@suse.de \
    --cc=ak@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=cavokz@gmail.com \
    --cc=cebbert@redhat.com \
    --cc=chuckw@quantumlinux.com \
    --cc=davej@redhat.com \
    --cc=jmforbes@linuxtx.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mkrufky@linuxtv.org \
    --cc=patches@x86-64.org \
    --cc=rdunlap@xenotime.net \
    --cc=reviews@ml.cw.f00f.org \
    --cc=stable@kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=tytso@mit.edu \
    --cc=zwane@arm.linux.org.uk \
    /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.