x86: Add a 'pause' instruction in __udelay() for QEMU target
When running SMP configuration on QEMU (tcg mode, no kvm), there is a busy loop in start_aps(), calling udelay(), that waits for APs to show up online. However, there is a chance that VCPU1 will be timeout waiting, IOW the secondary VCPUs haven't started their execution yet. This patch adds a 'pause' instruction in __udelay() only for QEMU target, to give other VCPUs a chance to run. When QEMU sees the 'pause' instruction, it will yeild the execution to other CPUs. Signed-off-by: Miao Yan <yanmiaobest@gmail.com> Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Acked-by: Simon Glass <sjg@chromium.org> Tested-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
947eb4396d
commit
417576c2f1
|
@ -355,7 +355,15 @@ void __udelay(unsigned long usec)
|
||||||
stop = now + usec * get_tbclk_mhz();
|
stop = now + usec * get_tbclk_mhz();
|
||||||
|
|
||||||
while ((int64_t)(stop - get_ticks()) > 0)
|
while ((int64_t)(stop - get_ticks()) > 0)
|
||||||
|
#if defined(CONFIG_QEMU) && defined(CONFIG_SMP)
|
||||||
|
/*
|
||||||
|
* Add a 'pause' instruction on qemu target,
|
||||||
|
* to give other VCPUs a chance to run.
|
||||||
|
*/
|
||||||
|
asm volatile("pause");
|
||||||
|
#else
|
||||||
;
|
;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int timer_init(void)
|
int timer_init(void)
|
||||||
|
|
Loading…
Reference in New Issue