diff options
Diffstat (limited to 'arch/x86/kernel/smpboot.c')
| -rw-r--r-- | arch/x86/kernel/smpboot.c | 15 | 
1 files changed, 9 insertions, 6 deletions
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index c4f33b2e77d..a5e928b0cb5 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c @@ -735,12 +735,8 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu)  		goto do_rest;  	} -	if (!keventd_up() || current_is_keventd()) -		c_idle.work.func(&c_idle.work); -	else { -		schedule_work(&c_idle.work); -		wait_for_completion(&c_idle.done); -	} +	schedule_work(&c_idle.work); +	wait_for_completion(&c_idle.done);  	if (IS_ERR(c_idle.idle)) {  		printk("failed fork for CPU %d\n", cpu); @@ -816,6 +812,13 @@ do_rest:  			if (cpumask_test_cpu(cpu, cpu_callin_mask))  				break;	/* It has booted */  			udelay(100); +			/* +			 * Allow other tasks to run while we wait for the +			 * AP to come online. This also gives a chance +			 * for the MTRR work(triggered by the AP coming online) +			 * to be completed in the stop machine context. +			 */ +			schedule();  		}  		if (cpumask_test_cpu(cpu, cpu_callin_mask))  | 
