mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Chris Wright <chrisw@sous-sol.org>
To: linux-kernel@vger.kernel.org, stable@kernel.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>,
	Chuck Ebbert <cebbert@redhat.com>,
	Domenico Andreoli <cavokz@gmail.com>,
	torvalds@linux-foundation.org, akpm@linux-foundation.org,
	alan@lxorguk.ukuu.org.uk, Paul Mackerras <paulus@samba.org>,
	Greg Kroah-Hartman <gregkh@suse.de>
Subject: [patch 02/50] POWERPC Bolt in SLB entry for kernel stack on secondary cpus
Date: Fri, 06 Jun 2008 18:02:17 -0700	[thread overview]
Message-ID: <20080607010546.730949060@sous-sol.org> (raw)
In-Reply-To: <20080607010215.358296706@sous-sol.org>

[-- Attachment #1: powerpc-bolt-in-slb-entry-for-kernel-stack-on-secondary-cpus.patch --]
[-- Type: text/plain, Size: 4381 bytes --]

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

From: Paul Mackerras <paulus@samba.org>

This is upstream as commit 3b5750644b2ffa2a76fdfe7b4e00e4af2ecf3539.

This fixes a regression reported by Kamalesh Bulabel where a POWER4
machine would crash because of an SLB miss at a point where the SLB
miss exception was unrecoverable.  This regression is tracked at:

http://bugzilla.kernel.org/show_bug.cgi?id=10082

SLB misses at such points shouldn't happen because the kernel stack is
the only memory accessed other than things in the first segment of the
linear mapping (which is mapped at all times by entry 0 of the SLB).
The context switch code ensures that SLB entry 2 covers the kernel
stack, if it is not already covered by entry 0.  None of entries 0
to 2 are ever replaced by the SLB miss handler.

Where this went wrong is that the context switch code assumes it
doesn't have to write to SLB entry 2 if the new kernel stack is in the
same segment as the old kernel stack, since entry 2 should already be
correct.  However, when we start up a secondary cpu, it calls
slb_initialize, which doesn't set up entry 2.  This is correct for
the boot cpu, where we will be using a stack in the kernel BSS at this
point (i.e. init_thread_union), but not necessarily for secondary
cpus, whose initial stack can be allocated anywhere.  This doesn't
cause any immediate problem since the SLB miss handler will just
create an SLB entry somewhere else to cover the initial stack.

In fact it's possible for the cpu to go quite a long time without SLB
entry 2 being valid.  Eventually, though, the entry created by the SLB
miss handler will get overwritten by some other entry, and if the next
access to the stack is at an unrecoverable point, we get the crash.

This fixes the problem by making slb_initialize create a suitable
entry for the kernel stack, if we are on a secondary cpu and the stack
isn't covered by SLB entry 0.  This requires initializing the
get_paca()->kstack field earlier, so I do that in smp_create_idle
where the current field is initialized.  This also abstracts a bit of
the computation that mk_esid_data in slb.c does so that it can be used
in slb_initialize.

Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>

---
 arch/powerpc/kernel/smp.c |    2 ++
 arch/powerpc/mm/slb.c     |   21 +++++++++++++--------
 2 files changed, 15 insertions(+), 8 deletions(-)

--- a/arch/powerpc/kernel/smp.c
+++ b/arch/powerpc/kernel/smp.c
@@ -386,6 +386,8 @@ static void __init smp_create_idle(unsig
 		panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p));
 #ifdef CONFIG_PPC64
 	paca[cpu].__current = p;
+	paca[cpu].kstack = (unsigned long) task_thread_info(p)
+		+ THREAD_SIZE - STACK_FRAME_OVERHEAD;
 #endif
 	current_set[cpu] = task_thread_info(p);
 	task_thread_info(p)->cpu = cpu;
--- a/arch/powerpc/mm/slb.c
+++ b/arch/powerpc/mm/slb.c
@@ -44,13 +44,13 @@ static void slb_allocate(unsigned long e
 	slb_allocate_realmode(ea);
 }
 
+#define slb_esid_mask(ssize)	\
+	(((ssize) == MMU_SEGSIZE_256M)? ESID_MASK: ESID_MASK_1T)
+
 static inline unsigned long mk_esid_data(unsigned long ea, int ssize,
 					 unsigned long slot)
 {
-	unsigned long mask;
-
-	mask = (ssize == MMU_SEGSIZE_256M)? ESID_MASK: ESID_MASK_1T;
-	return (ea & mask) | SLB_ESID_V | slot;
+	return (ea & slb_esid_mask(ssize)) | SLB_ESID_V | slot;
 }
 
 #define slb_vsid_shift(ssize)	\
@@ -301,11 +301,16 @@ void slb_initialize(void)
 
 	create_shadowed_slbe(VMALLOC_START, mmu_kernel_ssize, vflags, 1);
 
+	/* For the boot cpu, we're running on the stack in init_thread_union,
+	 * which is in the first segment of the linear mapping, and also
+	 * get_paca()->kstack hasn't been initialized yet.
+	 * For secondary cpus, we need to bolt the kernel stack entry now.
+	 */
 	slb_shadow_clear(2);
+	if (raw_smp_processor_id() != boot_cpuid &&
+	    (get_paca()->kstack & slb_esid_mask(mmu_kernel_ssize)) > PAGE_OFFSET)
+		create_shadowed_slbe(get_paca()->kstack,
+				     mmu_kernel_ssize, lflags, 2);
 
-	/* We don't bolt the stack for the time being - we're in boot,
-	 * so the stack is in the bolted segment.  By the time it goes
-	 * elsewhere, we'll call _switch() which will bolt in the new
-	 * one. */
 	asm volatile("isync":::"memory");
 }

-- 

  parent reply	other threads:[~2008-06-07  1:24 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-07  1:02 [patch 00/50] 2.6.25.6 -stable review Chris Wright
2008-06-07  1:02 ` [patch 01/50] block: do_mounts - accept root=<non-existant partition> Chris Wright
2008-06-09 13:38   ` Adrian Bunk
2008-06-09 16:48     ` Chris Wright
2008-06-07  1:02 ` Chris Wright [this message]
2008-06-07  1:02 ` [patch 03/50] USB: remove PICDEM FS USB demo (04d8:000c) device from ldusb Chris Wright
2008-06-07  1:02 ` [patch 04/50] USB: unusual_devs: Add support for GI 0401 SD-Card interface Chris Wright
2008-06-07  1:02 ` [patch 05/50] USB: option: add new Dell 5520 HSDPA variant Chris Wright
2008-06-07  1:02 ` [patch 06/50] USB: add Zoom Telephonics Model 3095F V.92 USB Mini External modem to cdc-acm Chris Wright
2008-06-07  1:02 ` [patch 07/50] USB: do not handle device 1410:5010 in option driver Chris Wright
2008-06-07  1:02 ` [patch 08/50] USB: add Telstra NextG CDMA id to " Chris Wright
2008-06-07  1:02 ` [patch 09/50] ext3/4: fix uninitialized bs in ext3/4_xattr_set_handle() Chris Wright
2008-06-07  1:02 ` [patch 10/50] libata: force hardreset if link is in powersave mode Chris Wright
2008-06-07  1:27   ` Linus Torvalds
2008-06-07  1:57     ` [stable] " Greg KH
2008-06-07 16:51       ` Linus Torvalds
2008-06-07  3:14     ` Jeff Garzik
2008-06-07  1:02 ` [patch 11/50] memory_hotplug: always initialize pageblock bitmap Chris Wright
2008-06-07  1:02 ` [patch 12/50] USB: fix build errors in ohci-omap.c and ohci-sm501.c Chris Wright
2008-06-07  1:02 ` [patch 13/50] i2c-nforce2: Disable the second SMBus channel on the DFI Lanparty NF4 Expert Chris Wright
2008-06-07  1:02 ` [patch 14/50] i2c/max6875: Really prevent 24RF08 corruption Chris Wright
2008-06-07  1:02 ` [patch 15/50] x86: user_regset_view table fix for ia32 on 64-bit Chris Wright
2008-06-07  1:02 ` [patch 16/50] i386: fix asm constraint in do_IRQ() Chris Wright
2008-06-07  1:02 ` [patch 17/50] CIFS: Fix UNC path prefix on QueryUnixPathInfo to have correct slash Chris Wright
2008-06-07  1:02 ` [patch 18/50] USB: add TELIT HDSPA UC864-E modem to option driver Chris Wright
2008-06-07  1:02 ` [patch 19/50] usb-serial: Use ftdi_sio driver for RATOC REX-USB60F Chris Wright
2008-06-07  1:02 ` [patch 20/50] cgroups: remove node_ prefix_from ns subsystem Chris Wright
2008-06-07  1:02 ` [patch 21/50] brd: dont show ramdisks in /proc/partitions Chris Wright
2008-06-07 21:51   ` H. Peter Anvin
2008-06-09 17:08     ` [stable] " Chris Wright
2008-06-09 19:49       ` Willy Tarreau
2008-06-09 20:28       ` H. Peter Anvin
2008-06-07  1:02 ` [patch 22/50] types.h: dont expose struct ustat to userspace Chris Wright
2008-06-07  1:02 ` [patch 23/50] x86: dont read maxlvt before checking if APIC is mapped Chris Wright
2008-06-07  1:02 ` [patch 24/50] IPoIB: Test for NULL broadcast object in ipiob_mcast_join_finish() Chris Wright
2008-06-07  1:02 ` [patch 25/50] x86: fix setup of cyc2ns in tsc_64.c Chris Wright
2008-06-07  1:02 ` [patch 26/50] x86: if we cannot calibrate the TSC, we panic Chris Wright
2008-06-07  1:02 ` [patch 27/50] x86: distangle user disabled TSC from unstable Chris Wright
2008-06-07  1:02 ` [patch 28/50] x86: disable TSC for sched_clock() when calibration failed Chris Wright
2008-06-07  1:02 ` [patch 29/50] XFS: Fix memory corruption with small buffer reads Chris Wright
2008-06-07  1:02 ` [patch 30/50] x86: prevent PGE flush from interruption/preemption Chris Wright
2008-06-07  1:02 ` [patch 31/50] Revert "PCI: remove default PCI expansion ROM memory allocation" Chris Wright
2008-06-07  1:02 ` [patch 32/50] PS3: gelic: fix memory leak Chris Wright
2008-06-07  1:02 ` [patch 33/50] netfilter: xt_iprange: module aliases for xt_iprange Chris Wright
2008-06-07  1:02 ` [patch 34/50] HID: split Numlock emulation quirk from HID_QUIRK_APPLE_HAS_FN Chris Wright
2008-06-07  1:02 ` [patch 35/50] CPUFREQ: Make acpi-cpufreq more robust against BIOS freq changes behind our back Chris Wright
2008-06-07  1:02 ` [patch 36/50] x86, fpu: fix CONFIG_PREEMPT=y corruption of applications FPU stack Chris Wright
2008-06-07  1:02 ` [patch 37/50] netfilter: nf_conntrack_expect: fix error path unwind in nf_conntrack_expect_init() Chris Wright
2008-06-07  1:02 ` [patch 38/50] netfilter: xt_connlimit: fix accouning when receive RST packet in ESTABLISHED state Chris Wright
2008-06-07  1:02 ` [patch 39/50] netfilter: nf_conntrack_ipv6: fix inconsistent lock state in nf_ct_frag6_gather() Chris Wright
2008-06-07  1:02 ` [patch 40/50] atl1: fix 4G memory corruption bug Chris Wright
2008-06-07  1:02 ` [patch 41/50] Smack: fuse mount hang fix Chris Wright
2008-06-07  1:02 ` [patch 42/50] proc: calculate the correct /proc/<pid> link count Chris Wright
2008-06-07  1:02 ` [patch 43/50] pagemap: fix bug in add_to_pagemap, require aligned-length reads of /proc/pid/pagemap Chris Wright
2008-06-07  1:02 ` [patch 44/50] brk: make sys_brk() honor COMPAT_BRK when computing lower bound Chris Wright
2008-06-07  1:03 ` [patch 45/50] eCryptfs: remove unnecessary page decrypt call Chris Wright
2008-06-07  1:03 ` [patch 46/50] md: do not compute parity unless it is on a failed drive Chris Wright
2008-06-07  1:03 ` [patch 47/50] md: fix uninitialized use of mddev->recovery_wait Chris Wright
2008-06-07  1:03 ` [patch 48/50] md: fix prexor vs sync_request race Chris Wright
2008-06-07  1:03 ` [patch 49/50] capabilities: remain source compatible with 32-bit raw legacy capability support Chris Wright
2008-06-07  1:03 ` [patch 50/50] cpufreq: fix null object access on Transmeta CPU Chris Wright
2008-06-07  3:49 ` [patch 00/50] 2.6.25.6 -stable review Hugh Dickins
2008-06-07  4:24   ` [stable] " Chris Wright

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=20080607010546.730949060@sous-sol.org \
    --to=chrisw@sous-sol.org \
    --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=gregkh@suse.de \
    --cc=jmforbes@linuxtx.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mkrufky@linuxtv.org \
    --cc=paulus@samba.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®