2.5.3-pre1: more scheduling updates
Subsystems (3)
PATCH 1/1 2.5.3-pre1: more scheduling updates
Linus,
More scheduling related merges. This time the code comes from Ingo's J0 patch, Rusty, and myself. Again I am only including bug fixes and cleanups that should be obviously correct, although most of these are a bit less critical than the last patch I sent.
I am still refraining from anything that is controversial, especially the load_balance and sched/idle_tick changes, which I'll leave to Ingo and Davide. I hope everyone can agree on a solution.
Itemized Changes:
- init and smp_boot fixes
- do lock order by address not rq_cpu
- remove old RT event comment
- make lock_task_rq return rq in lieu of passing it
- make lock_task_rq and unlock_task_rq inlines instead of defines
- grab spin_lock later in wake_up_forked_process
- remove RUN_CHILD_FIRST #if's. it is clear this works, now.
- misc cleanups
Robert Love
arch/i386/kernel/smpboot.c +2 -1
@@ -462,6 +462,7 @@* things done here to the most necessary things. */ cpu_init (); +init_idle ();smp_callin ();while (!atomic_read (&smp_commenced))rep_nop ();
@@ -470,8 +471,8 @@* the local TLBs too. */ local_flush_tlb (); +idle_startup_done (); -init_idle ();return cpu_idle (); }
include/asm-i386/smplock.h +2 -2
@@ -19,8 +19,8 @@do { \if (unlikely (task->lock_depth >=0 )) { \spin_unlock (&kernel_flag); \ -release_irqlock (cpu); \ -__sti (); \ +if (global_irq_holder == (cpu)) \ +BUG (); \ } \ }while (0 )
include/linux/sched.h +3 -1
@@ -136,8 +136,11 @@extern rwlock_t tasklist_lock;extern spinlock_t mmlist_lock; +typedef struct task_struct task_t ; +extern void sched_init (void );extern void init_idle (void ); +extern void idle_startup_done (void );extern void show_state (void );extern void cpu_init (void );extern void trap_init (void );
@@ -221,7 +224,6 @@extern struct user_struct root_user;#define INIT_USER (&root_user) -typedef struct task_struct task_t ;typedef struct prio_array prio_array_t ;struct task_struct {
init/main.c +12 -10
@@ -290,8 +290,6 @@extern void setup_arch (char **);extern void cpu_idle (void ); -unsigned long wait_init_idle; -#ifndef CONFIG_SMP #ifdef CONFIG_X86_LOCAL_APIC
@@ -305,6 +303,16 @@#else +static unsigned long __initdata wait_init_idle; + +void __init idle_startup_done (void ) +{ +clear_bit (smp_processor_id (), &wait_init_idle); +while (wait_init_idle) { +cpu_relax (); +barrier (); + } +}/* Called by boot processor to activate the rest. */ static void __init smp_init (void )
@@ -315,6 +323,7 @@ smp_threads_ready=1 ;smp_commence (); + idle_startup_done(); }#endif
@@ -411,6 +420,7 @@check_bugs ();printk ("POSIX conformance testing by UNIFIX\n" ); +init_idle ();/* * We count on the initial thread going ok * Like idlers init is an unlocked kernel thread, which will
@@ -418,14 +428,6 @@*/ smp_init (); -/* -* Finally, we wait for all other CPU's, and initialize this -* thread that will become the idle thread for the boot CPU. -* After this, the scheduler is fully initialized, and we can -* start creating and running new threads. -*/ -init_idle (); -/* Do the rest non-__init'ed, we're now alive */ rest_init (); }
kernel/fork.c +0 -7
@@ -746,23 +746,16 @@if (p->ptrace &PT_PTRACED )send_sig (SIGSTOP , p,1 ); -#define RUN_CHILD_FIRST 1 -#if RUN_CHILD_FIRST wake_up_forked_process (p);/* do this last */ -#else -wake_up_process (p);/* do this last */ -#endif ++total_forks;if (clone_flags &CLONE_VFORK )wait_for_completion (&vfork); -#if RUN_CHILD_FIRST else /* * Let the child process run first, to avoid most of the * COW overhead when the child exec()s afterwards. */ current->need_resched =1 ; -#endif fork_out:return retval;
kernel/sched.c +36 -42
184 lines not on this page · raw message