boot time scheduling hile atomic
Takeharu KATO
kato.takeharu at jp.fujitsu.com
Wed Mar 16 16:24:41 EST 2005
Hi Benjamin:
Thank you for your response.
> I think the problem is more why are we calling a syscall while the
> preempt count is up ?
>
Because, start_kernel(line:455) in init/main.c count up this.
-- start_kernel (init/main.c)
451 /*
452 * Disable preemption - early bootup scheduling is extremely
453 * fragile until we cpu_idle() for the first time.
454 */
455 preempt_disable();
456 build_all_zonelists();
-- start_kernel(init/main.c)
Preemption is disabled until it enters the body of idle task from rest_init.
Please see below:
-- rest_init (init/main.c)
379 static void noinline rest_init(void)
380 __releases(kernel_lock)
381 {
382 kernel_thread(init, NULL, CLONE_FS | CLONE_SIGHAND);
383 numa_default_policy();
384 unlock_kernel();
385 preempt_enable_no_resched();
386 cpu_idle();
387 }
--
I think that the kernel assumes that init thread(the kernel thread which become to
init process later) is kicked by idle process(cpu_idle).
But, the kernel invoke a system call trap when it execute kernel_thread call
(at rest_init line:382) on PowerPC.
The preemption count has positive value here.
So, PowerPC linux kernel invoke system call when the preempt count is up.
Regards,
--
Takeharu KATO
Fujitsu Limited
Email:kato.takeharu at jp.fujitsu.com
More information about the Linuxppc-dev
mailing list