Kernel-testers Development Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: David Miller <davem@davemloft.net>
To: a.beregalov@gmail.com
Cc: kernel-testers@vger.kernel.org, sparclinux@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: 2.6.26-rc: SPARC: Sun Ultra 10 can not boot
Date: Fri, 20 Jun 2008 15:51:39 -0700 (PDT)	[thread overview]
Message-ID: <20080620.155139.224032701.davem@davemloft.net> (raw)
In-Reply-To: <a4423d670806201542o5415cad7p6b9a38b67252cee1@mail.gmail.com>

From: "Alexander Beregalov" <a.beregalov@gmail.com>
Date: Sat, 21 Jun 2008 02:42:36 +0400

> I can not see such messages in lockdep output:
> 
> [   17.960404] Console: colour dummy device 80x25
> [   18.060543] console handover: boot [earlyprom0] -> real [tty0]
> [   18.169062] Lock dependency validator: Copyright (c) 2006 Red Hat, Inc.,
> Ingo Molnar
> [   18.169180] ... MAX_LOCKDEP_SUBCLASSES:    8
> [   18.169246] ... MAX_LOCK_DEPTH:          48
> [   18.169310] ... MAX_LOCKDEP_KEYS:        2048
> [   18.169376] ... CLASSHASH_SIZE:           1024
> [   18.169444] ... MAX_LOCKDEP_ENTRIES:     8192
> [   18.169509] ... MAX_LOCKDEP_CHAINS:      16384
> [   18.169577] ... CHAINHASH_SIZE:          8192
> [   18.169643]  memory used by lock dependency info: 1648 kB
> [   18.169722]  per task-struct memory footprint: 2688 bytes
> [   18.169798] ------------------------
> [   18.169855] | Locking API testsuite:

Something is screwey here... Hmmm...

When I added the changeset in question, it fixed a problem in that
any backtrace of a kernel thread would loop forever at the end.
Any stack backtrace would hang or reach a safety limit (such as
the one imposed by lockdep).

Please double check that you are precisely reverting this patch
below _before_ doing these tests:

commit a051bc5bb1ac6dc138d529077fa20cbbc6622d95
Author: David S. Miller <davem@davemloft.net>
Date:   Wed May 21 18:14:28 2008 -0700

    sparc64: Fix kernel thread stack termination.
    
    Because of the silly way I set up the initial stack for
    new kernel threads, there is a loop at the top of the
    stack.
    
    To fix this, properly add another stack frame that is copied
    from the parent and terminate it in the child by setting
    the frame pointer in that frame to zero.
    
    Signed-off-by: David S. Miller <davem@davemloft.net>

diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c
index 0a0c05f..2084f81 100644
--- a/arch/sparc64/kernel/process.c
+++ b/arch/sparc64/kernel/process.c
@@ -657,20 +657,39 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
 		struct task_struct *p, struct pt_regs *regs)
 {
 	struct thread_info *t = task_thread_info(p);
+	struct sparc_stackf *parent_sf;
+	unsigned long child_stack_sz;
 	char *child_trap_frame;
+	int kernel_thread;
 
-	/* Calculate offset to stack_frame & pt_regs */
-	child_trap_frame = task_stack_page(p) + (THREAD_SIZE - (TRACEREG_SZ+STACKFRAME_SZ));
-	memcpy(child_trap_frame, (((struct sparc_stackf *)regs)-1), (TRACEREG_SZ+STACKFRAME_SZ));
+	kernel_thread = (regs->tstate & TSTATE_PRIV) ? 1 : 0;
+	parent_sf = ((struct sparc_stackf *) regs) - 1;
 
-	t->flags = (t->flags & ~((0xffUL << TI_FLAG_CWP_SHIFT) | (0xffUL << TI_FLAG_CURRENT_DS_SHIFT))) |
+	/* Calculate offset to stack_frame & pt_regs */
+	child_stack_sz = ((STACKFRAME_SZ + TRACEREG_SZ) +
+			  (kernel_thread ? STACKFRAME_SZ : 0));
+	child_trap_frame = (task_stack_page(p) +
+			    (THREAD_SIZE - child_stack_sz));
+	memcpy(child_trap_frame, parent_sf, child_stack_sz);
+
+	t->flags = (t->flags & ~((0xffUL << TI_FLAG_CWP_SHIFT) |
+				 (0xffUL << TI_FLAG_CURRENT_DS_SHIFT))) |
 		(((regs->tstate + 1) & TSTATE_CWP) << TI_FLAG_CWP_SHIFT);
 	t->new_child = 1;
 	t->ksp = ((unsigned long) child_trap_frame) - STACK_BIAS;
-	t->kregs = (struct pt_regs *)(child_trap_frame+sizeof(struct sparc_stackf));
+	t->kregs = (struct pt_regs *) (child_trap_frame +
+				       sizeof(struct sparc_stackf));
 	t->fpsaved[0] = 0;
 
-	if (regs->tstate & TSTATE_PRIV) {
+	if (kernel_thread) {
+		struct sparc_stackf *child_sf = (struct sparc_stackf *)
+			(child_trap_frame + (STACKFRAME_SZ + TRACEREG_SZ));
+
+		/* Zero terminate the stack backtrace.  */
+		child_sf->fp = NULL;
+		t->kregs->u_regs[UREG_FP] =
+		  ((unsigned long) child_sf) - STACK_BIAS;
+
 		/* Special case, if we are spawning a kernel thread from
 		 * a userspace task (via KMOD, NFS, or similar) we must
 		 * disable performance counters in the child because the
@@ -681,12 +700,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
 			t->pcr_reg = 0;
 			t->flags &= ~_TIF_PERFCTR;
 		}
-		t->kregs->u_regs[UREG_FP] = t->ksp;
 		t->flags |= ((long)ASI_P << TI_FLAG_CURRENT_DS_SHIFT);
-		flush_register_windows();
-		memcpy((void *)(t->ksp + STACK_BIAS),
-		       (void *)(regs->u_regs[UREG_FP] + STACK_BIAS),
-		       sizeof(struct sparc_stackf));
 		t->kregs->u_regs[UREG_G6] = (unsigned long) t;
 		t->kregs->u_regs[UREG_G4] = (unsigned long) t->task;
 	} else {

  parent reply	other threads:[~2008-06-20 22:51 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-19 14:07 2.6.26-rc: SPARC: Sun Ultra 10 can not boot Alexander Beregalov
2008-06-19 16:02 ` Alexander Beregalov
     [not found]   ` <a4423d670806190902l48c542e0i6a7380a2d3e7f520-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-06-19 23:10     ` David Miller
2008-06-20  2:00   ` David Miller
     [not found]     ` <20080619.190048.193701955.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-06-20 21:19       ` Alexander Beregalov
2008-06-20 21:21         ` David Miller
     [not found]           ` <a4423d670806201542o5415cad7p6b9a38b67252cee1@mail.gmail.com>
2008-06-20 22:51             ` David Miller [this message]
2008-06-20 23:12               ` Alexander Beregalov
2008-06-20 23:21                 ` David Miller
     [not found]                   ` <20080620.162135.203810660.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-06-20 23:36                     ` Alexander Beregalov
     [not found]                       ` <a4423d670806201636n4f3d107bk290ed831eb5eefb4-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-07-07  9:19                         ` Alexander Beregalov
     [not found]                           ` <a4423d670807070219s2dd43aaia29713f5076ecd0d-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-07-07 11:01                             ` David Miller
     [not found]                               ` <20080707.040126.178187777.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-07-07 13:05                                 ` Mikael Pettersson
     [not found]                                   ` <18546.5247.797478.66373-gq7oiAaKCbRt3AgVzhmPzw@public.gmane.org>
2008-07-07 15:59                                     ` Alexander Beregalov
2008-08-08  6:01                                       ` David Miller
2008-08-08  9:31                                         ` Alexander Beregalov
2008-08-08  9:40                                           ` David Miller
     [not found]                                             ` <20080808.024024.205614839.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-08-08 10:14                                               ` Alexander Beregalov
     [not found]                                                 ` <a4423d670808080314weed9178o9f9ef52803a68501-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-08-08 10:38                                                   ` David Miller
     [not found]                                                     ` <20080808.033811.129671951.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-08-08 10:56                                                       ` Alexander Beregalov
     [not found]                                                         ` <a4423d670808080356r6573102am8a1eb9dcc83910c8-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2008-08-08 11:18                                                           ` David Miller
2008-08-08 11:52                                                             ` Alexander Beregalov
2008-08-08 23:17                                                               ` David Miller
2008-08-14  3:53                                                               ` David Miller
     [not found]                                                                 ` <20080813.205333.202202181.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-08-14 10:19                                                                   ` Alexander Beregalov
     [not found]                                                             ` <20080808.041814.41687650.davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>
2008-08-08 14:28                                                               ` Alexander Beregalov

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=20080620.155139.224032701.davem@davemloft.net \
    --to=davem@davemloft.net \
    --cc=a.beregalov@gmail.com \
    --cc=kernel-testers@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sparclinux@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox