Re: 2.6.8-rc4-mm1

Robert Picco
2004-08-10T22:22:47Z

copy_thread expects a switch_stack below pt_regs on the stack. the
switch_stack would have the parent's bspstore value for computing how
much register backing store to copy into child. there isn't a
switch_stack and the resultant bspstore size computed is enormous
(depends on what there is on stack). i suspect printk has changed stack
and the code layout changed too.

diff -ruN -X /home/picco/losl/dontdiff linux-2.6.8-rc3-mm2-orig/arch/ia64/kernel/process.c linux-2.6.8-rc3-mm2/arch/ia64/kernel/process.c
--- linux-2.6.8-rc3-mm2-orig/arch/ia64/kernel/process.c 2004-08-10 17:24:51.000000000 -0400
+++ linux-2.6.8-rc3-mm2/arch/ia64/kernel/process.c 2004-08-10 17:33:51.000000000 -0400
@@ -352,7 +352,7 @@
* For SMP idle threads, fork_by_hand() calls do_fork with
* NULL regs.
*/
- if (!regs)
+ if (clone_flags & CLONE_IDLETASK)
return 0;
#endif

diff -ruN -X /home/picco/losl/dontdiff linux-2.6.8-rc3-mm2-orig/include/linux/sched.h linux-2.6.8-rc3-mm2/include/linux/sched.h
--- linux-2.6.8-rc3-mm2-orig/include/linux/sched.h 2004-08-10 17:25:07.000000000 -0400
+++ linux-2.6.8-rc3-mm2/include/linux/sched.h 2004-08-10 17:31:56.000000000 -0400
@@ -40,6 +40,7 @@
#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
#define CLONE_SIGHAND 0x00000800 /* set if signal handlers and blocked signals shared */
+#define CLONE_IDLETASK 0x00001000 /* set if new pid should be 0 (kernel only)*/
#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
diff -ruN -X /home/picco/losl/dontdiff linux-2.6.8-rc3-mm2-orig/kernel/fork.c linux-2.6.8-rc3-mm2/kernel/fork.c
--- linux-2.6.8-rc3-mm2-orig/kernel/fork.c 2004-08-10 17:25:10.000000000 -0400
+++ linux-2.6.8-rc3-mm2/kernel/fork.c 2004-08-10 17:32:56.000000000 -0400
@@ -1196,7 +1196,7 @@
struct pt_regs regs;

memset(&regs, 0, sizeof(struct pt_regs));
- task = copy_process(CLONE_VM, 0, &regs, 0, NULL, NULL, 0);
+ task = copy_process(CLONE_VM|CLONE_IDLETASK, 0, &regs, 0, NULL, NULL, 0);
if (!task)
return ERR_PTR(-ENOMEM);
init_idle(task, cpu);