Good debugging, but the fix is incorrect (or at least unnecessarily slow).
I see where the problem is, and I also see why it _only_ happens on UP.
The problem is that the fork return point to the new process does not
initialize %ebx in the UP case.
It _does_ initialize it in the SMP case, and this is basically just an
oversight.
This patch should fix it properly, please tell me whether that is true..
Linus
-----
diff -u --recursive --new-file v2.1.129/linux/arch/i386/kernel/entry.S linux/arch/i386/kernel/entry.S
--- v2.1.129/linux/arch/i386/kernel/entry.S Sun Nov 8 14:02:42 1998
+++ linux/arch/i386/kernel/entry.S Thu Nov 19 09:53:08 1998
@@ -150,14 +150,14 @@
jmp ret_from_sys_call
-#ifdef __SMP__
ALIGN
.globl ret_from_smpfork
-ret_from_smpfork:
+ret_from_fork:
GET_CURRENT(%ebx)
+#ifdef __SMP__
btrl $0, SYMBOL_NAME(scheduler_lock)
- jmp ret_from_sys_call
#endif /* __SMP__ */
+ jmp ret_from_sys_call
/*
* Return to user mode is not as complex as all this looks,
diff -u --recursive --new-file v2.1.129/linux/arch/i386/kernel/process.c linux/arch/i386/kernel/process.c
--- v2.1.129/linux/arch/i386/kernel/process.c Fri Oct 9 13:27:05 1998
+++ linux/arch/i386/kernel/process.c Thu Nov 19 09:53:35 1998
@@ -50,11 +50,7 @@
spinlock_t semaphore_wake_lock = SPIN_LOCK_UNLOCKED;
-#ifdef __SMP__
-asmlinkage void ret_from_fork(void) __asm__("ret_from_smpfork");
-#else
-asmlinkage void ret_from_fork(void) __asm__("ret_from_sys_call");
-#endif
+asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
#ifdef CONFIG_APM
extern int apm_do_idle(void);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/