boot time scheduling hile atomic
Takeharu KATO
kato.takeharu at jp.fujitsu.com
Fri Mar 11 17:19:41 EST 2005
Hi Joerg:
First of all, I am sorry to making mistake on my stack analysis.
After all, I found what is wrong.
The syscall_exit_work is called(jumped) by fork, strictly speaking,
this is caused by kernel_thead for init process.
At this point, kernel set a need_resched flag in thread_info struct
(flags member).
So, the system executes syscall_exit_work when
the swapper thread exited from syscall.
However, the syscall_exit_work routine does not check
preempt counts when it calls schedule function.
FYI, I post the patch which fix this problem.
I've confirmed the problem has been removed by this patch,
but I can not figure out whether it is truely
correct or not.
Please review this.
Signed-off-by: Takeharu KATO <kato.takeharu at jp.fujitsu.com>
--- linux-2.6.11/arch/ppc/kernel/entry.S 2005-03-09 12:57:32.000000000 +0900
+++ linux-2.6.11-wdt/arch/ppc/kernel/entry.S 2005-03-11 14:39:16.345490784 +0900
@@ -314,10 +314,16 @@ syscall_exit_work:
SYNC
MTMSRD(r10) /* disable interrupts again */
rlwinm r12,r1,0,0,18 /* current_thread_info() */
- lwz r9,TI_FLAGS(r12)
5:
+#ifdef CONFIG_PREEMPT
+ lwz r0,TI_PREEMPT(r12)
+ cmpwi 0,r0,0 /* if non-zero, we can not reschedule here */
+ bne 6f
+#endif
+ lwz r9,TI_FLAGS(r12)
andi. r0,r9,_TIF_NEED_RESCHED
bne 1f
+6:
lwz r5,_MSR(r1)
andi. r5,r5,MSR_PR
beq syscall_exit_cont
--
Takeharu KATO
Fujitsu Limited
Email:kato.takeharu at jp.fujitsu.com
More information about the Linuxppc-dev
mailing list