From: Peter Zijlstra on 24 Jun 2010 09:20 On Thu, 2010-06-24 at 00:11 +0400, Ilya Loginov wrote: > There is a bug in rest_init function. The problem is that kernel_init > thread starts before initialization of kthreadd_task when > CONFIG_PREEMPT_VOLUNTARY is enabled. > > kernel_init thread do wake_up_process(kthreadd_task) and I have kernel Oops in > try_to_wake_up when I try to get p->state. > > I found this problem on 2.6.34 on FPGA. It is very slow, and > find_task_by_pid is done after reschenduling. I have no this problem on > 2.6.35-rc3 because kernel code is moved. But if I write simple loop like > volatile int tmp; > for(i = 0; i < preset_lpj; i++) > tmp++; > right after kernel_thread(kernel_init,.... , I have this problem on > 2.6.35-rc3 too. > > I understand that real problem is reschenduling in init code, but > I have no ability to fix it. Ooh, interesting problem, so kernel_init() will indeed spawn all kinds of kernel threads, and doing so before we create the kthreadd will result in the oops you observed. However I suspect the ordering is like it is because we want init to have pid 1, if we were to re-order like you suggest kthreadd will end up with pid 1 and init with pid 2. Humm, how to fix this... > Signed-off-by: Ilya Loginov <isloginov(a)gmail.com> > --- > diff --git a/init/main.c b/init/main.c > index 3bdb152..9febd69 100644 > --- a/init/main.c > +++ b/init/main.c > @@ -428,12 +428,12 @@ static noinline void __init_refok rest_init(void) > int pid; > > rcu_scheduler_starting(); > - kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); > numa_default_policy(); > pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES); > rcu_read_lock(); > kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns); > rcu_read_unlock(); > + kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); > unlock_kernel(); > > /* -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Ilya Loginov on 24 Jun 2010 09:30 On Thu, 24 Jun 2010 15:11:36 +0200 Peter Zijlstra <peterz(a)infradead.org> wrote: > However I suspect the ordering is like it is because we want init to > have pid 1, if we were to re-order like you suggest kthreadd will end up > with pid 1 and init with pid 2. Strange, but init does not die after I did this. Fix me if I wrong, but it wants to have pid 1, and die in other case. Interesting... -- Ilya Loginov <isloginov(a)gmail.com> -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
From: Илья Логинов on 24 Jun 2010 10:10 On Thu, 24 Jun 2010 17:23:34 +0400 Ilya Loginov <isloginov(a)gmail.com> wrote: > Strange, but init does not die after I did this. Fix me if I wrong, but it wants > to have pid 1, and die in other case. > > Interesting... Yeah, of course, I am wrong. To make it clear I watched sources of sysvinit and founded out that if pid not equal to 1 init does exit(telinit(p, argc, argv)); So, it does not die. Anyway, I would have kernel panic. -- éÌØÑ ìÏÇÉÎÏ× <zerone2(a)gmail.com>
|
Pages: 1 Prev: [rfc] new stat*fs-like syscall? Next: mfd/stmpexxx: change touchscreen irq |